diff --git a/src/ai/ai_magic.cpp b/src/ai/ai_magic.cpp index 6b9a28dc9..6f5438e58 100644 --- a/src/ai/ai_magic.cpp +++ b/src/ai/ai_magic.cpp @@ -191,7 +191,7 @@ local int AiEyeOfVisionSpell(Unit* unit) r=SyncRand(); /* s0m3body: each unit can have different MaxMana, the original condition is testing MaxMana-10, * so let's take unit's maxmana * 245/255 as a new treshold */ - if( unit->Mana>((unit->Type->Magic * 245 ) / 255) && !(r%32) ) { + if( unit->Mana>((unit->Type->_MaxMana * 245 ) / 255) && !(r%32) ) { if( unit->Mana>AiEyeOfVision->ManaCost ) { DebugLevel0Fn("`%s' cast eye of vision\n" _C_ unit->Type->Ident); @@ -244,7 +244,7 @@ local int AiHolyVisionSpell(Unit* unit) /* s0m3body: each unit can have different MaxMana, the original condition is testing MaxMana-10, * * so let's take unit's maxmana * 245/255 as a new treshold */ - if( unit->Mana>((unit->Type->Magic * 245)/255) && !(r%32) ) { + if( unit->Mana>((unit->Type->_MaxMana * 245)/255) && !(r%32) ) { if( unit->Mana>AiHolyVision->ManaCost ) { int x; int y; diff --git a/src/include/unittype.h b/src/include/unittype.h index 3eb0f6e6c..e12660b94 100644 --- a/src/include/unittype.h +++ b/src/include/unittype.h @@ -130,9 +130,13 @@ ** ** Maximum hit points ** +** UnitType::_MaxMana +** +** Maximum mana points +** ** UnitType::Magic ** -** Unit can cast spells +** Unit is a mage ** ** UnitType::_Costs[::MaxCosts] ** @@ -483,6 +487,7 @@ struct _unit_type_ { Construction*Construction; /// What is shown in construction phase int _SightRange; /// Sight range unsigned _HitPoints; /// Maximum hit points + int _MaxMana; /// Maximum mana points // FIXME: only flag int Magic; /// Unit can cast spells diff --git a/src/ui/mainscr.cpp b/src/ui/mainscr.cpp index 22fb86fa9..67602024d 100644 --- a/src/ui/mainscr.cpp +++ b/src/ui/mainscr.cpp @@ -116,8 +116,8 @@ local void UiDrawManaBar(const Unit* unit,int x,int y) VideoFillRectangleClip(ColorBlack,x,y+3,ICON_WIDTH+7,4); if( unit->HP ) { /* s0m3body: mana bar should represent proportional value of Mana with respect to - * MaxMana (unit->Type->Magic) for the unit */ - f=(100*unit->Mana)/unit->Type->Magic; + * MaxMana (unit->Type->_MaxMana) for the unit */ + f=(100*unit->Mana)/unit->Type->_MaxMana; f=(f*(ICON_WIDTH+5))/100; VideoFillRectangleClip(ColorBlue,x+1,y+3+1,f,2); } @@ -529,7 +529,7 @@ global void DrawUnitInfo(const Unit* unit) VideoDrawText(x+59,y+8+140+1,GameFont,"Magic:"); VideoDrawRectangleClip(ColorGray,x+108,y+8+140,61,14); VideoDrawRectangleClip(ColorBlack,x+108+1,y+8+140+1,61-2,14-2); - i=(100*unit->Mana)/unit->Type->Magic; + i=(100*unit->Mana)/unit->Type->_MaxMana; i=(i*(61-4))/100; VideoFillRectangleClip(ColorBlue,x+108+2,y+8+140+2,i,14-4); @@ -539,7 +539,7 @@ global void DrawUnitInfo(const Unit* unit) /* s0m3body: fix to display mana bar properly for any maxmana value */ /* s0m3body: max mana can vary for the unit */ - i=(100*unit->Mana)/unit->Type->Magic; + i=(100*unit->Mana)/unit->Type->_MaxMana; i=(i*w)/100; VideoDrawRectangleClip(ColorGray, x+16, y+8+140, w+4, 16 ); VideoDrawRectangleClip(ColorBlack,x+16+1,y+8+140+1,w+2,16-2); @@ -1112,7 +1112,7 @@ global void DrawInfoPanel(void) || Selected[0]->Orders[0].Action==UnitActionUpgradeTo || Selected[0]->Orders[0].Action==UnitActionTrain) ) { i=3; - } else if( Selected[0]->Type->Magic ) { + } else if( Selected[0]->Type->_MaxMana ) { i=2; } else { i=1; diff --git a/src/unit/script_unittype.cpp b/src/unit/script_unittype.cpp index 5a74ff1f8..b972dfa96 100644 --- a/src/unit/script_unittype.cpp +++ b/src/unit/script_unittype.cpp @@ -65,7 +65,7 @@ local long SiodUnitTypeTag; /// siod unit-type object ** ** @param list List describing the unit-type. */ -local SCM CclDefineNewUnitType(SCM list) +local SCM CclDefineUnitType(SCM list) { SCM value; SCM sublist; @@ -169,12 +169,15 @@ local SCM CclDefineNewUnitType(SCM list) } else if( gh_eq_p(value,gh_symbol2scm("hit-points")) ) { type->_HitPoints=gh_scm2int(gh_car(list)); list=gh_cdr(list); + } else if( gh_eq_p(value,gh_symbol2scm("max-mana")) ) { + type->_MaxMana=gh_scm2int(gh_car(list)); + if( type->_MaxMana>MaxMana ) { + DebugLevel0Fn("Too much mana %d\n" _C_ type->_MaxMana); + type->_MaxMana=MaxMana; + } + list=gh_cdr(list); } else if( gh_eq_p(value,gh_symbol2scm("magic")) ) { type->Magic=gh_scm2int(gh_car(list)); - if( type->Magic>MaxMana ) { - DebugLevel0Fn("Too much mana %d\n" _C_ type->Magic); - type->Magic=MaxMana; - } list=gh_cdr(list); } else if( gh_eq_p(value,gh_symbol2scm("tile-size")) ) { sublist=gh_car(list); @@ -381,586 +384,6 @@ local SCM CclDefineNewUnitType(SCM list) return SCM_UNSPECIFIED; } -/** -** Parse unit-type. -** -** @note FIXME: This should be changed to a more readable and useable -** format. I thinking of an tagged format 'size and this should be -** parsed by a general parser. -** -** @param list List describing the unit-type. -*/ -local SCM CclDefineOldUnitType(SCM list) -{ - SCM value; - SCM temp; - char* str; - UnitType* type; - int i; - int j; - int n; - - DebugLevel0Fn("This version will be soon removed.\n"); - - // Slot identifier - - value=gh_car(list); - str=gh_scm2newstr(value,NULL); - IfDebug( i=NoWarningUnitType; NoWarningUnitType=1; ); - type=UnitTypeByIdent(str); - IfDebug( NoWarningUnitType=i; ); - if( type ) { - DebugLevel0Fn("Redefining unit-type `%s'\n" _C_ str); - free(str); - } else { - type=NewUnitTypeSlot(str); - } - - // Name - list=gh_cdr(list); - value=gh_car(list); - str=gh_scm2newstr(value,NULL); - DebugLevel3("\tName: %s\n" _C_ str); - free(type->Name); - type->Name=str; - - // Graphic - - list=gh_cdr(list); - value=gh_car(list); - if( gh_symbol_p(value) || gh_string_p(value) ) { - str=gh_scm2newstr(value,NULL); - DebugLevel3("\tSame-Sprite: %s\n" _C_ str); - free(type->SameSprite); - type->SameSprite=str; - free(type->File[0]); - type->File[0]=NULL; - free(type->File[1]); - type->File[1]=NULL; - free(type->File[2]); - type->File[2]=NULL; - free(type->File[3]); - type->File[3]=NULL; - } else { - if( gh_vector_length(value)!=4 ) { - fprintf(stderr,"Wrong vector length\n"); - } - free(type->SameSprite); - type->SameSprite=NULL; - - temp=gh_vector_ref(value,gh_int2scm(0)); - if( gh_null_p(temp) ) { - str=NULL; - } else { - str=gh_scm2newstr(temp,NULL); - } - DebugLevel3("\tFile-0: %s\n" _C_ str); - free(type->File[0]); - type->File[0]=str; - - temp=gh_vector_ref(value,gh_int2scm(1)); - if( gh_null_p(temp) ) { - str=NULL; - } else { - str=gh_scm2newstr(temp,NULL); - } - DebugLevel3("\tFile-1: %s\n" _C_ str); - free(type->File[1]); - type->File[1]=str; - - temp=gh_vector_ref(value,gh_int2scm(2)); - if( gh_null_p(temp) ) { - str=NULL; - } else { - str=gh_scm2newstr(temp,NULL); - } - DebugLevel3("\tFile-2: %s\n" _C_ str); - free(type->File[2]); - type->File[2]=str; - - temp=gh_vector_ref(value,gh_int2scm(3)); - if( gh_null_p(temp) ) { - str=NULL; - } else { - str=gh_scm2newstr(temp,NULL); - } - DebugLevel3("\tFile-3: %s\n" _C_ str); - free(type->File[3]); - type->File[3]=str; - } - - // Graphic Size - - list=gh_cdr(list); - value=gh_car(list); - - temp=gh_car(value); - type->Width=gh_scm2int(temp); - temp=gh_car(gh_cdr(value)); - type->Height=gh_scm2int(temp); - DebugLevel3("\tGraphic: %d,%d\n" _C_ type->Width _C_ type->Height); - - // Animations - - list=gh_cdr(list); - value=gh_car(list); - str=gh_scm2newstr(value,NULL); - type->Animations=AnimationsByIdent(str); - free(str); - - // Icon - - list=gh_cdr(list); - value=gh_car(list); - str=gh_scm2newstr(value,NULL); - DebugLevel3("\tIcon: %s\n" _C_ str); - - free(type->Icon.Name); - type->Icon.Name=str; - - // Speed - - list=gh_cdr(list); - value=gh_car(list); - i=gh_scm2int(value); - DebugLevel3("\tSpeed: %d\n" _C_ i); - type->_Speed=i; - - // Overlay frame - - list=gh_cdr(list); - value=gh_car(list); - i=gh_scm2int(value); - DebugLevel3("\tOverlay frame: %d\n" _C_ i); - type->Construction=ConstructionByWcNum(i); - - // Sight range - - list=gh_cdr(list); - value=gh_car(list); - i=gh_scm2int(value); - DebugLevel3("\tSight range: %d\n" _C_ i); - type->_SightRange=i; - - // Hitpoints - - list=gh_cdr(list); - value=gh_car(list); - i=gh_scm2int(value); - DebugLevel3("\tHitpoints: %d\n" _C_ i); - type->_HitPoints=i; - - // Magic - - list=gh_cdr(list); - value=gh_car(list); - i=gh_scm2int(value); - DebugLevel3("\tMagic: %d\n" _C_ i); - type->Magic=i; - - // Costs - - list=gh_cdr(list); - value=gh_car(list); - n=gh_vector_length(value); - if( n<4 || n>MaxCosts ) { - fprintf(stderr,"Wrong vector length\n"); - if( n>MaxCosts ) { - n=MaxCosts; - } - } - - for( j=0; j<n; ++j ) { - temp=gh_vector_ref(value,gh_int2scm(j)); - i=gh_scm2int(temp); - type->_Costs[j]=i; - } - while( j<MaxCosts ) { - type->_Costs[j++]=0; - } - - DebugLevel3("\tCosts: %d,%d,%d,%d\n" - _C_ type->_Costs[TimeCost] _C_ type->_Costs[GoldCost] - _C_ type->_Costs[WoodCost] _C_ type->_Costs[OilCost]); - - // Tile Size - - list=gh_cdr(list); - value=gh_car(list); - - temp=gh_car(value); - type->TileWidth=gh_scm2int(temp); - temp=gh_car(gh_cdr(value)); - type->TileHeight=gh_scm2int(temp); - DebugLevel3("\tTile: %d,%d\n" _C_ type->TileWidth _C_ type->TileHeight); - - // Box Size - - list=gh_cdr(list); - value=gh_car(list); - - temp=gh_car(value); - type->BoxWidth=gh_scm2int(temp); - temp=gh_car(gh_cdr(value)); - type->BoxHeight=gh_scm2int(temp); - DebugLevel3("\tBox: %d,%d\n" _C_ type->BoxWidth _C_ type->BoxHeight); - - // Minimal attack range - - list=gh_cdr(list); - value=gh_car(list); - i=gh_scm2int(value); - DebugLevel3("\tMinimal AttackRange: %d\n" _C_ i); - type->MinAttackRange=i; - - // Attack range - - list=gh_cdr(list); - value=gh_car(list); - i=gh_scm2int(value); - DebugLevel3("\tAttackRange: %d\n" _C_ i); - type->_AttackRange=i; - - // Reaction range computer - - list=gh_cdr(list); - value=gh_car(list); - i=gh_scm2int(value); - DebugLevel3("\tReaction range computer: %d\n" _C_ i); - type->ReactRangeComputer=i; - - // Reaction range player - - list=gh_cdr(list); - value=gh_car(list); - i=gh_scm2int(value); - DebugLevel3("\tReaction range player: %d\n" _C_ i); - type->ReactRangePerson=i; - - // Armor - - list=gh_cdr(list); - value=gh_car(list); - i=gh_scm2int(value); - DebugLevel3("\tArmor: %d\n" _C_ i); - type->_Armor=i; - - // Priority - - list=gh_cdr(list); - value=gh_car(list); - i=gh_scm2int(value); - DebugLevel3("\tPriority: %d\n" _C_ i); - type->Priority=i; - - // Basic damage - - list=gh_cdr(list); - value=gh_car(list); - i=gh_scm2int(value); - DebugLevel3("\tBasic damage: %d\n" _C_ i); - type->_BasicDamage=i; - - // Piercing damage - - list=gh_cdr(list); - value=gh_car(list); - i=gh_scm2int(value); - DebugLevel3("\tPiercing damage: %d\n" _C_ i); - type->_PiercingDamage=i; - - // Weapons upgradable - - list=gh_cdr(list); - value=gh_car(list); - i=gh_scm2int(value); - DebugLevel3("\tWeaponsUpgradable: %d\n" _C_ i); - type->WeaponsUpgradable=i; - - // Armor upgradable - - list=gh_cdr(list); - value=gh_car(list); - i=gh_scm2int(value); - DebugLevel3("\tArmorUpgradable: %d\n" _C_ i); - type->ArmorUpgradable=i; - - // Decay rate - - list=gh_cdr(list); - value=gh_car(list); - i=gh_scm2int(value); - DebugLevel3("\tDecay rate: %d\n" _C_ i); - type->DecayRate=i; - - // Annoy computer factor - - list=gh_cdr(list); - value=gh_car(list); - i=gh_scm2int(value); - DebugLevel3("\tAnnoy computer factor: %d\n" _C_ i); - type->AnnoyComputerFactor=i; - - // Points - - list=gh_cdr(list); - value=gh_car(list); - i=gh_scm2int(value); - DebugLevel3("\tPoints: %d\n" _C_ i); - type->Points=i; - - // Food demand - - list=gh_cdr(list); - value=gh_car(list); - i=gh_scm2int(value); - DebugLevel3("\tFood demand: %d\n" _C_ i); - type->Demand=i; - - // Food supply - - list=gh_cdr(list); - value=gh_car(list); - i=gh_scm2int(value); - DebugLevel3("\tFood supply: %d\n" _C_ i); - type->Supply=i; - - // Missile - - list=gh_cdr(list); - value=gh_car(list); - str=gh_scm2newstr(value,NULL); - DebugLevel3("\tMissile: %s\n" _C_ str); - - free(type->Missile.Name); - type->Missile.Name=str; - - // Corpse - - list=gh_cdr(list); - temp=gh_car(list); - - free(type->CorpseName); - type->CorpseName=NULL; - type->CorpseType=NULL; - type->CorpseScript=0; - if( !gh_null_p(temp) ) { - value=gh_car(temp); - temp=gh_cdr(temp); - str=gh_scm2newstr(value,NULL); - DebugLevel3("\tCorpse: %s\n" _C_ str); - type->CorpseName=str; - - value=gh_car(temp); - i=gh_scm2int(value); - type->CorpseScript=i; - } - - // Flags - type->UnitType=0; // reset all - type->MouseAction=0; - type->CanTarget=0; - type->LandUnit=0; - type->AirUnit=0; - type->SeaUnit=0; - type->ExplodeWhenKilled=0; - type->Critter=0; - type->Building=0; - type->Submarine=0; - type->CanSeeSubmarine=0; - type->CowerWorker=0; - type->Tanker=0; - type->Transporter=0; - type->GivesOil=0; - type->StoresGold=0; - type->Vanishes=0; - type->GroundAttack=0; - type->IsUndead=0; - type->ShoreBuilding=0; - type->CanCastSpell=0; - type->StoresWood=0; - type->CanAttack=0; - type->Tower=0; - type->OilPatch=0; - type->GoldMine=0; - type->Hero=0; - type->StoresOil=0; - type->Volatile=0; - type->CowerMage=0; - type->Organic=0; - type->SelectableByRectangle=0; - type->Teleporter=0; - - while( !gh_null_p(list) ) { - list=gh_cdr(list); - value=gh_car(list); - if( gh_vector_p(value) ) { - break; - } - - if( gh_eq_p(value,gh_symbol2scm("type-land")) ) { - type->UnitType=UnitTypeLand; - } else if( gh_eq_p(value,gh_symbol2scm("type-fly")) ) { - type->UnitType=UnitTypeFly; - } else if( gh_eq_p(value,gh_symbol2scm("type-naval")) ) { - type->UnitType=UnitTypeNaval; - - } else if( gh_eq_p(value,gh_symbol2scm("right-none")) ) { - type->MouseAction=MouseActionNone; - } else if( gh_eq_p(value,gh_symbol2scm("right-attack")) ) { - type->MouseAction=MouseActionAttack; - } else if( gh_eq_p(value,gh_symbol2scm("right-move")) ) { - type->MouseAction=MouseActionMove; - } else if( gh_eq_p(value,gh_symbol2scm("right-harvest")) ) { - type->MouseAction=MouseActionHarvest; - } else if( gh_eq_p(value,gh_symbol2scm("right-haul-oil")) ) { - type->MouseAction=MouseActionHaulOil; - } else if( gh_eq_p(value,gh_symbol2scm("right-demolish")) ) { - type->MouseAction=MouseActionDemolish; - } else if( gh_eq_p(value,gh_symbol2scm("right-sail")) ) { - type->MouseAction=MouseActionSail; - - } else if( gh_eq_p(value,gh_symbol2scm("can-target-land")) ) { - type->CanTarget|=CanTargetLand; - } else if( gh_eq_p(value,gh_symbol2scm("can-target-sea")) ) { - type->CanTarget|=CanTargetSea; - } else if( gh_eq_p(value,gh_symbol2scm("can-target-air")) ) { - type->CanTarget|=CanTargetAir; - - } else if( gh_eq_p(value,gh_symbol2scm("land-unit")) ) { - type->LandUnit=1; - } else if( gh_eq_p(value,gh_symbol2scm("air-unit")) ) { - type->AirUnit=1; - } else if( gh_eq_p(value,gh_symbol2scm("sea-unit")) ) { - type->SeaUnit=1; - - } else if( gh_eq_p(value,gh_symbol2scm("explode-when-killed")) ) { - type->ExplodeWhenKilled=1; - } else if( gh_eq_p(value,gh_symbol2scm("critter")) ) { - type->Critter=1; - } else if( gh_eq_p(value,gh_symbol2scm("building")) ) { - type->Building=1; - } else if( gh_eq_p(value,gh_symbol2scm("submarine")) ) { - type->Submarine=1; - } else if( gh_eq_p(value,gh_symbol2scm("can-see-submarine")) ) { - type->CanSeeSubmarine=1; - } else if( gh_eq_p(value,gh_symbol2scm("cower-worker")) ) { - type->CowerWorker=1; - } else if( gh_eq_p(value,gh_symbol2scm("tanker")) ) { - type->Tanker=1; - } else if( gh_eq_p(value,gh_symbol2scm("transporter")) ) { - type->Transporter=1; - } else if( gh_eq_p(value,gh_symbol2scm("gives-oil")) ) { - type->GivesOil=1; - } else if( gh_eq_p(value,gh_symbol2scm("stores-gold")) ) { - type->StoresGold=1; - } else if( gh_eq_p(value,gh_symbol2scm("vanishes")) ) { - type->Vanishes=1; - } else if( gh_eq_p(value,gh_symbol2scm("can-ground-attack")) ) { - type->GroundAttack=1; - } else if( gh_eq_p(value,gh_symbol2scm("isundead")) ) { - type->IsUndead=1; - } else if( gh_eq_p(value,gh_symbol2scm("shore-building")) ) { - type->ShoreBuilding=1; - } else if( gh_eq_p(value,gh_symbol2scm("can-cast-spell")) ) { - type->CanCastSpell=1; - } else if( gh_eq_p(value,gh_symbol2scm("stores-wood")) ) { - type->StoresWood=1; - } else if( gh_eq_p(value,gh_symbol2scm("can-attack")) ) { - type->CanAttack=1; - } else if( gh_eq_p(value,gh_symbol2scm("tower")) ) { - type->Tower=1; - } else if( gh_eq_p(value,gh_symbol2scm("oil-patch")) ) { - type->OilPatch=1; - } else if( gh_eq_p(value,gh_symbol2scm("gives-gold")) ) { - type->GoldMine=1; - } else if( gh_eq_p(value,gh_symbol2scm("hero")) ) { - type->Hero=1; - } else if( gh_eq_p(value,gh_symbol2scm("stores-oil")) ) { - type->StoresOil=1; - } else if( gh_eq_p(value,gh_symbol2scm("volatile")) ) { - type->Volatile=1; - } else if( gh_eq_p(value,gh_symbol2scm("cower-mage")) ) { - type->CowerMage=1; - } else if( gh_eq_p(value,gh_symbol2scm("organic")) ) { - type->Organic=1; - } else if( gh_eq_p(value,gh_symbol2scm("selectable-by-rectangle")) ) { - type->SelectableByRectangle=1; - } else if( gh_eq_p(value,gh_symbol2scm("teleporter")) ) { - type->Teleporter=1; - - } else { - str=gh_scm2newstr(value,NULL); - fprintf(stderr,"Unsupported flag %s\n",str); - free(str); - } - } - - // Sounds - - if( gh_vector_length(value)!=5 ) { - fprintf(stderr,"Wrong vector length\n"); - } - - temp=gh_vector_ref(value,gh_int2scm(0)); - if( gh_null_p(temp) ) { - str=NULL; - } else { - str=gh_scm2newstr(temp,NULL); - } - free(type->Sound.Selected.Name); - type->Sound.Selected.Name=str; - - temp=gh_vector_ref(value,gh_int2scm(1)); - if( gh_null_p(temp) ) { - str=NULL; - } else { - str=gh_scm2newstr(temp,NULL); - } - free(type->Sound.Acknowledgement.Name); - type->Sound.Acknowledgement.Name=str; - - temp=gh_vector_ref(value,gh_int2scm(2)); - if( gh_null_p(temp) ) { - str=NULL; - } else { - str=gh_scm2newstr(temp,NULL); - } - free(type->Sound.Ready.Name); - type->Sound.Ready.Name=str; - - temp=gh_vector_ref(value,gh_int2scm(3)); - if( gh_null_p(temp) ) { - str=NULL; - } else { - str=gh_scm2newstr(temp,NULL); - } - free(type->Sound.Help.Name); - type->Sound.Help.Name=str; - - temp=gh_vector_ref(value,gh_int2scm(4)); - if( gh_null_p(temp) ) { - str=NULL; - } else { - str=gh_scm2newstr(temp,NULL); - } - free(type->Sound.Dead.Name); - type->Sound.Dead.Name=str; - - list=gh_cdr(list); - value=gh_car(list); - - if( gh_null_p(value) ) { - str=NULL; - } else { - str=gh_scm2newstr(value,NULL); - } - free(type->Weapon.Attack.Name); - type->Weapon.Attack.Name=str; - - return SCM_UNSPECIFIED; -} - /** ** Parse unit-stats. ** @@ -1335,8 +758,7 @@ local SCM CclDefineAnimations(SCM list) */ global void UnitTypeCclRegister(void) { - //gh_new_procedureN("define-old-unit-type",CclDefineOldUnitType); - gh_new_procedureN("define-new-unit-type",CclDefineNewUnitType); + gh_new_procedureN("define-unit-type",CclDefineUnitType); gh_new_procedureN("define-unit-stats",CclDefineUnitStats); SiodUnitTypeTag=allocate_user_tc(); diff --git a/src/unit/unit.cpp b/src/unit/unit.cpp index 94392cdf9..c171040d1 100644 --- a/src/unit/unit.cpp +++ b/src/unit/unit.cpp @@ -291,7 +291,7 @@ global void InitUnit(Unit* unit, UnitType* type) } if (type->CanCastSpell) { - unit->Mana = (type->Magic * MAGIC_FOR_NEW_UNITS) / 100; + unit->Mana = (type->_MaxMana * MAGIC_FOR_NEW_UNITS) / 100; } unit->Active = 1; @@ -1425,7 +1425,7 @@ global void UnitIncrementMana(void) --unit->Blink; } - if( unit->Type->CanCastSpell && unit->Mana!=unit->Type->Magic ) { + if( unit->Type->CanCastSpell && unit->Mana!=unit->Type->_MaxMana ) { unit->Mana++; // some frames delayed done my color cycling diff --git a/src/unit/unit_draw.cpp b/src/unit/unit_draw.cpp index 722fada20..1d348f438 100644 --- a/src/unit/unit_draw.cpp +++ b/src/unit/unit_draw.cpp @@ -1006,9 +1006,9 @@ local void DrawDecoration(const Unit* unit,const UnitType* type,int x,int y) // Mana bar on right side of unit. FIXME: combine bar and sprite // if( ShowManaBar ) { - /* s0m3body: mana bar should display man proportionally to unit's max mana (unit->Type->Magic) */ - if( type->CanCastSpell && !(ShowNoFull && unit->Mana==unit->Type->Magic) ) { - DrawManaBar(x,y,type,unit->Type->Magic,unit->Mana); + /* s0m3body: mana bar should display man proportionally to unit's max mana (unit->Type->_MaxMana) */ + if( type->CanCastSpell && !(ShowNoFull && unit->Mana==unit->Type->_MaxMana) ) { + DrawManaBar(x,y,type,unit->Type->_MaxMana,unit->Mana); } else if( type->GivesOil || type->GoldMine || type->OilPatch ) { DrawManaBar(x,y,type,655350,unit->Value); } @@ -1070,9 +1070,9 @@ local void DrawDecoration(const Unit* unit,const UnitType* type,int x,int y) // Mana dot on right side of unit. // if( ShowManaDot ) { - /* s0m3body: MaxMana can vary for each unit, it is stored in unit->Type->Magic */ - if( type->CanCastSpell && !(ShowNoFull && unit->Mana==unit->Type->Magic) ) { - DrawManaSprite(x,y,type,unit->Type->Magic,unit->Mana); + /* s0m3body: MaxMana can vary for each unit, it is stored in unit->Type->_MaxMana */ + if( type->CanCastSpell && !(ShowNoFull && unit->Mana==unit->Type->_MaxMana) ) { + DrawManaSprite(x,y,type,unit->Type->_MaxMana,unit->Mana); } else if( type->GivesOil || type->GoldMine || type->OilPatch ) { DrawManaSprite(x,y,type,655350,unit->Value); } diff --git a/src/unit/unittype.cpp b/src/unit/unittype.cpp index 7c237ed80..94d7edb69 100644 --- a/src/unit/unittype.cpp +++ b/src/unit/unittype.cpp @@ -272,9 +272,6 @@ global void ParsePudUDTA(const char* udta,int length __attribute__((unused))) for( i=0; i<110; ++i ) { // Flag if unit is magic unittype=UnitTypeByWcNum(i); v=Fetch8(udta); - if( v==1 ) { - v=255; // Compatibility hack 1 = FULL - } unittype->Magic=v; } for( i=0; i<110; ++i ) { // Build time * 6 = one second FRAMES @@ -649,6 +646,9 @@ local void NewSaveUnitType(FILE* file,const UnitType* type,int all) } fprintf(file," 'speed %d\n",type->_Speed); fprintf(file," 'hit-points %d\n",type->_HitPoints); + if( all || type->_MaxMana ) { + fprintf(file," 'magic %d\n",type->_MaxMana); + } if( all || type->Magic ) { fprintf(file," 'magic %d\n",type->Magic); } @@ -894,295 +894,6 @@ local void NewSaveUnitType(FILE* file,const UnitType* type,int all) fprintf(file,")\n\n"); } -#if 0 -/** -** Save state of an unit-type to file. -** -** @param type Unit-type to save. -** @param file Output file. -*/ -local void OldSaveUnitType(const UnitType* type,FILE* file) -{ - int i; - const UnitType* temp; - - fprintf(file,"(define-unit-type \"%s\"",type->Ident); - if( strlen(type->Ident)<12 ) { - fputs("\t\t",file); - } else if( strlen(type->Ident)<20 ) { - fputc('\t',file); - } - fprintf(file,"\t\"%s\"\n",type->Name); - fputs(" ;; graphic data\n ",file); - if( type->SameSprite ) { - fprintf(file,"\"%s\"",type->SameSprite); - } else { - fprintf(file,"#("); - for( i=0; i<4; ++i ) { - if( i ) { - fputs("\n ",file); - } - if( type->File[i] ) { - fprintf(file,"\"%s\"",type->File[i]); - } else { - fprintf(file,"()"); - } - } - fprintf(file," )"); - } - fprintf(file,"\n '( %3d %3d )\t\t\t;; graphic size\n" - ,type->Width,type->Height); - - //fprintf(file," \"animations-%s\"\t;; animations\n",type->Ident+5); - - for( temp=UnitTypes; temp->OType && temp!=type ; ++temp ) { - if( temp->Animations==type->Animations ) { - break; - } - } - fprintf(file," \"animations-%s\"\n",temp->Ident+5); - - fprintf(file," \"%s\"\n",IdentOfIcon(type->Icon.Icon)); - - fprintf(file," ;;Speed Constr SightR Hitpnt Magic BTime Gold Wood Oil Ore Stone Coal\n"); - fprintf(file," %6d %6d %6d %6d %5d #(%4d %5d %5d %5d %5d %5d %5d)\n" - ,type->_Speed - ,type->Construction->Nr - ,type->_SightRange - ,type->_HitPoints - ,type->Magic - ,type->_Costs[TimeCost] - ,type->_Costs[GoldCost] - ,type->_Costs[WoodCost] - ,type->_Costs[OilCost] - ,type->_Costs[OreCost] - ,type->_Costs[StoneCost] - ,type->_Costs[CoalCost]); - - fprintf(file," ;;Tile Box Size >Attack <Attack ReactC ReactH\n"); - fprintf(file," '( %d %d ) '( %3d %3d ) %6d %7d %6d %7d\n" - ,type->TileWidth - ,type->TileHeight - ,type->BoxWidth - ,type->BoxHeight - ,type->MinAttackRange - ,type->_AttackRange - ,type->ReactRangeComputer - ,type->ReactRangePerson); - - fprintf(file," ;;Armor Prior Damage Pierc WUpgr AUpgr\n"); - fprintf(file," %6d %5d %6d %6d %7d %7d\n" - ,type->_Armor - ,type->Priority - ,type->_BasicDamage - ,type->_PiercingDamage - ,type->WeaponsUpgradable - ,type->ArmorUpgradable); - - fprintf(file," ;;Decay Annoy\tPoints Food - +\n"); - fprintf(file," %5d %6d %7d %5d %5d\n" - ,type->DecayRate - ,type->AnnoyComputerFactor - ,type->Points - ,type->Demand - ,type->Supply); - - fprintf(file," \"%s\"\n",type->Missile.Name); - if( type->CorpseName ) { - fprintf(file," '(\"%s\" %d)\n",type->CorpseName,type->CorpseScript); - } else { - fprintf(file," '()\n"); - } - - fprintf(file," "); - switch( type->UnitType ) { - case UnitTypeLand: - fprintf(file,"'type-land"); - break; - case UnitTypeFly: - fprintf(file,"'type-fly"); - break; - case UnitTypeNaval: - fprintf(file,"'type-naval"); - break; - default: - fprintf(file,"'type-unknown"); - break; - } - fprintf(file,"\n"); - - fprintf(file," "); - switch( type->MouseAction ) { - case MouseActionNone: - fprintf(file,"'right-none"); - break; - case MouseActionAttack: - fprintf(file,"'right-attack"); - break; - case MouseActionMove: - fprintf(file,"'right-move"); - break; - case MouseActionHarvest: - fprintf(file,"'right-harvest"); - break; - case MouseActionHaulOil: - fprintf(file,"'right-haul-oil"); - break; - case MouseActionDemolish: - fprintf(file,"'right-demolish"); - break; - case MouseActionSail: - fprintf(file,"'right-sail"); - break; - default: - fprintf(file,"'right-unknown"); - break; - } - fprintf(file,"\n"); - - if( type->CanTarget ) { - fprintf(file," "); - if( type->CanTarget&CanTargetLand ) { - fprintf(file,"'can-target-land "); - } - if( type->CanTarget&CanTargetSea ) { - fprintf(file,"'can-target-sea "); - } - if( type->CanTarget&CanTargetAir ) { - fprintf(file,"'can-target-air "); - } - if( type->CanTarget&~7 ) { - fprintf(file,"'can-target-other "); - } - fprintf(file,"\n"); - } - - fprintf(file," ;; flags\n"); - if( type->LandUnit ) { - fprintf(file," 'land-unit\n"); - } - if( type->AirUnit ) { - fprintf(file," 'air-unit\n"); - } - if( type->SeaUnit ) { - fprintf(file," 'sea-unit\n"); - } - if( type->ExplodeWhenKilled ) { - fprintf(file," 'explode-when-killed\n"); - } - if( type->Critter ) { - fprintf(file," 'critter\n"); - } - if( type->Building ) { - fprintf(file," 'building\n"); - } - if( type->Submarine ) { - fprintf(file," 'submarine\n"); - } - if( type->CanSeeSubmarine ) { - fprintf(file," 'can-see-submarine\n"); - } - if( type->CowerWorker ) { - fprintf(file," 'cower-worker\n"); - } - if( type->Tanker ) { - fprintf(file," 'tanker\n"); - } - if( type->Transporter ) { - fprintf(file," 'transporter\n"); - } - if( type->GivesOil ) { - fprintf(file," 'gives-oil\n"); - } - if( type->StoresGold ) { - fprintf(file," 'stores-gold\n"); - } - if( type->Vanishes ) { - fprintf(file," 'vanishes\n"); - } - if( type->GroundAttack ) { - fprintf(file," 'can-ground-attack\n"); - } - if( type->IsUndead ) { - fprintf(file," 'isundead\n"); - } - if( type->ShoreBuilding ) { - fprintf(file," 'shore-building\n"); - } - if( type->CanCastSpell ) { - fprintf(file," 'can-cast-spell\n"); - } - if( type->StoresWood ) { - fprintf(file," 'stores-wood\n"); - } - if( type->CanAttack ) { - fprintf(file," 'can-attack\n"); - } - if( type->Tower ) { - fprintf(file," 'tower\n"); - } - if( type->OilPatch ) { - fprintf(file," 'oil-patch\n"); - } - if( type->GoldMine ) { - fprintf(file," 'gives-gold\n"); - } - if( type->Hero ) { - fprintf(file," 'hero\n"); - } - if( type->StoresOil ) { - fprintf(file," 'stores-oil\n"); - } - if( type->Volatile ) { - fprintf(file," 'volatile\n"); - } - if( type->CowerMage ) { - fprintf(file," 'cower-mage\n"); - } - if( type->Organic ) { - fprintf(file," 'organic\n"); - } - if( type->SelectableByRectangle ) { - fprintf(file," 'selectable-by-rectangle\n"); - } - if( type->Teleporter ) { - fprintf(file," 'teleporter\n"); - } - - fprintf(file," ;; sounds\n"); - if( type->Sound.Selected.Name ) { - fprintf(file," #(\"%s\"\n",type->Sound.Selected.Name); - } else { - fprintf(file," #( ()\n"); - } - if( type->Sound.Acknowledgement.Name ) { - fprintf(file," \"%s\"\n",type->Sound.Acknowledgement.Name); - } else { - fprintf(file," ()\n"); - } - if( type->Sound.Ready.Name ) { - fprintf(file," \"%s\"\n",type->Sound.Ready.Name); - } else { - fprintf(file," ()\n"); - } - if( type->Sound.Help.Name ) { - fprintf(file," \"%s\"\n",type->Sound.Help.Name); - } else { - fprintf(file," ()\n"); - } - if( type->Sound.Dead.Name ) { - fprintf(file," \"%s\" )\n",type->Sound.Dead.Name); - } else { - fprintf(file," () )\n"); - } - if( type->Weapon.Attack.Name ) { - fprintf(file," \"%s\" )\n",type->Weapon.Attack.Name); - } else { - fprintf(file," () )\n"); - } -} -#endif - /** ** Save state of an unit-stats to file. **