From: Laszlo T. <ave...@us...> - 2011-12-12 22:05:57
|
gemrb: Infinity Engine emulator The branch master has been updated via e99774a395a96d318a5ea4266f6dbb904598102b (commit) via cd5699b5474cd02054b1754d7c830468e2944a2f (commit) Summary of changes: gemrb/core/IniSpawn.cpp | 89 +++++++++++++++++++++++++---- gemrb/core/IniSpawn.h | 18 +++++- gemrb/plugins/CREImporter/CREImporter.cpp | 4 - 3 files changed, 92 insertions(+), 19 deletions(-) from ea0a43b62e2f4f76145ad75e4f1b617263530457 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- http://gemrb.git.sourceforge.net/git/gitweb.cgi?p=gemrb/gemrb;a=commitdiff;h=e99774a395a96d318a5ea4266f6dbb904598102b commit e99774a395a96d318a5ea4266f6dbb904598102b Author: Avenger <ave...@so...> Date: Mon Dec 12 23:05:06 2011 +0100 just removed some commented lines diff --git a/gemrb/plugins/CREImporter/CREImporter.cpp b/gemrb/plugins/CREImporter/CREImporter.cpp index 1448136..f141d9c 100644 --- a/gemrb/plugins/CREImporter/CREImporter.cpp +++ b/gemrb/plugins/CREImporter/CREImporter.cpp @@ -964,8 +964,6 @@ void CREImporter::GetActorPST(Actor *act) str->Read( &tmpByte, 1 ); - //str->ReadWord( &act->AppearanceFlags1 ); - //str->ReadWord( &act->AppearanceFlags2 ); str->ReadDword( &act->AppearanceFlags ); for (i = 0; i < 7; i++) { @@ -2509,8 +2507,6 @@ int CREImporter::PutActorPST(DataStream *stream, Actor *actor) stream->Write( filling,3); //unknown tmpByte=actor->BaseStats[IE_COLORCOUNT]; stream->Write( &tmpByte, 1); - //stream->WriteWord( &actor->AppearanceFlags1); - //stream->WriteWord( &actor->AppearanceFlags2); stream->WriteDword( &actor->AppearanceFlags); for (i=0;i<7;i++) { http://gemrb.git.sourceforge.net/git/gitweb.cgi?p=gemrb/gemrb;a=commitdiff;h=cd5699b5474cd02054b1754d7c830468e2944a2f commit cd5699b5474cd02054b1754d7c830468e2944a2f Author: Avenger <ave...@so...> Date: Mon Dec 12 23:04:12 2011 +0100 implemented more Spawn Ini flags (see http://www.shsforums.net/topic/41118-ar0600ini) diff --git a/gemrb/core/IniSpawn.cpp b/gemrb/core/IniSpawn.cpp index b227ae4..c4e8371 100644 --- a/gemrb/core/IniSpawn.cpp +++ b/gemrb/core/IniSpawn.cpp @@ -140,7 +140,7 @@ static inline void GetElements(const char *s, ieVariable *storage, int count) // BINARY_MORE 10 //left has more bits than right // BINARY_LESS 11 //left has less bits than right -int IniSpawn::GetDiffMode(const char *keyword) +int IniSpawn::GetDiffMode(const char *keyword) const { if (!keyword) return NO_OPERATION; //-1 if (keyword[0]==0) return NO_OPERATION; //-1 @@ -153,31 +153,33 @@ int IniSpawn::GetDiffMode(const char *keyword) return NO_OPERATION; } -//unimplemented tags: +//unimplemented tags (* marks partially implemented): //*check_crowd -// good_mod, law_mod, lady_mod, murder_mod +//*good_mod, law_mod, lady_mod, murder_mod // control_var // spec_area -// death_faction -// death_team +//*death_faction +//*death_team // check_by_view_port //*do_not_spawn -// time_of_day +//*time_of_day // hold_selected_point_key // inc_spawn_point_index //*find_safest_point // exit // spawn_time_of_day // PST only -// auto_buddy +//*auto_buddy //*detail_level -void IniSpawn::ReadCreature(DataFileMgr *inifile, const char *crittername, CritterEntry &critter) +void IniSpawn::ReadCreature(DataFileMgr *inifile, const char *crittername, CritterEntry &critter) const { const char *s; int ps; memset(&critter,0,sizeof(critter)); + critter.TimeOfDay = (ieDword) inifile->GetKeyAsInt(crittername,"time_of_day", 0xffffffff); + if (inifile->GetKeyAsBool(crittername,"do_not_spawn",false)) { //if the do not spawn flag is true, ignore this entry return; @@ -427,6 +429,32 @@ void IniSpawn::ReadCreature(DataFileMgr *inifile, const char *crittername, Critt if (inifile->GetKeyAsBool(crittername,"death_scriptname",false)) { critter.Flags|=CF_DEATHVAR; } + if (inifile->GetKeyAsBool(crittername,"death_faction",false)) { + critter.Flags|=CF_FACTION; + } + if (inifile->GetKeyAsBool(crittername,"death_team",false)) { + critter.Flags|=CF_TEAM; + } + ps = inifile->GetKeyAsInt(crittername,"mod_good",0); + if (ps) { + critter.Flags|=CF_GOOD; + critter.DeathCounters[DC_GOOD] = ps; + } + ps = inifile->GetKeyAsBool(crittername,"mod_law",0); + if (ps) { + critter.Flags|=CF_LAW; + critter.DeathCounters[DC_LAW] = ps; + } + ps = inifile->GetKeyAsBool(crittername,"mod_lady",0); + if (ps) { + critter.Flags|=CF_LADY; + critter.DeathCounters[DC_LADY] = ps; + } + ps = inifile->GetKeyAsBool(crittername,"mod_murder",0); + if (ps) { + critter.Flags|=CF_MURDER; + critter.DeathCounters[DC_MURDER] = ps; + } //don't spawn when spawnpoint is visible if (inifile->GetKeyAsBool(crittername,"ignore_can_see",false)) { critter.Flags|=CF_IGNORECANSEE; @@ -455,7 +483,7 @@ void IniSpawn::ReadCreature(DataFileMgr *inifile, const char *crittername, Critt } } -void IniSpawn::ReadSpawnEntry(DataFileMgr *inifile, const char *entryname, SpawnEntry &entry) +void IniSpawn::ReadSpawnEntry(DataFileMgr *inifile, const char *entryname, SpawnEntry &entry) const { const char *s; @@ -475,7 +503,7 @@ void IniSpawn::ReadSpawnEntry(DataFileMgr *inifile, const char *entryname, Spawn } /* set by action */ -void IniSpawn::SetNamelessDeath(const ieResRef area, Point &pos, ieDword state) +void IniSpawn::SetNamelessDeath(const ieResRef area, Point &pos, ieDword state) { strnuprcpy(NamelessSpawnArea, area, 8); NamelessSpawnPoint = pos; @@ -578,7 +606,7 @@ void IniSpawn::RespawnNameless() } } -void IniSpawn::SpawnCreature(CritterEntry &critter) +void IniSpawn::SpawnCreature(CritterEntry &critter) const { if (!critter.creaturecount) { return; @@ -676,6 +704,32 @@ void IniSpawn::SpawnCreature(CritterEntry &critter) if (critter.ScriptName[0]) { cre->SetScriptName(critter.ScriptName); } + if (critter.Flags&CF_DEATHVAR) { + cre->AppearanceFlags|=APP_DEATHVAR; + } + if (critter.Flags&CF_FACTION) { + cre->AppearanceFlags|=APP_FACTION; + } + if (critter.Flags&CF_TEAM) { + cre->AppearanceFlags|=APP_TEAM; + } + if (critter.Flags&CF_GOOD) { + cre->DeathCounters[DC_GOOD] = critter.DeathCounters[DC_GOOD]; + cre->AppearanceFlags|=APP_GOOD; + } + if (critter.Flags&CF_LAW) { + cre->DeathCounters[DC_LAW] = critter.DeathCounters[DC_LAW]; + cre->AppearanceFlags|=APP_LAW; + } + if (critter.Flags&CF_LADY) { + cre->DeathCounters[DC_LADY] = critter.DeathCounters[DC_LADY]; + cre->AppearanceFlags|=APP_LADY; + } + if (critter.Flags&CF_MURDER) { + cre->DeathCounters[DC_MURDER] = critter.DeathCounters[DC_MURDER]; + cre->AppearanceFlags|=APP_MURDER; + } + if (critter.OverrideScript[0]) { cre->SetScript(critter.OverrideScript, SCR_OVERRIDE); } @@ -702,6 +756,15 @@ void IniSpawn::SpawnCreature(CritterEntry &critter) } } +bool IniSpawn::Schedule(ieDword appearance, ieDword gametime) const +{ + ieDword bit = 1<<((gametime/AI_UPDATE_TIME)%7200/300); + if (appearance & bit) { + return true; + } + return false; +} + void IniSpawn::SpawnGroup(SpawnEntry &event) { if (!event.critters) { @@ -717,6 +780,9 @@ void IniSpawn::SpawnGroup(SpawnEntry &event) for(int i=0;i<event.crittercount;i++) { CritterEntry* critter = event.critters+i; + if (!Schedule(critter->TimeOfDay, last_spawndate) ) { + continue; + } for(int j=0;j<critter->SpawnCount;j++) { SpawnCreature(*critter); } @@ -740,3 +806,4 @@ void IniSpawn::CheckSpawn() SpawnGroup(eventspawns[i]); } } + diff --git a/gemrb/core/IniSpawn.h b/gemrb/core/IniSpawn.h index 9a371b5..b7cfe2c 100644 --- a/gemrb/core/IniSpawn.h +++ b/gemrb/core/IniSpawn.h @@ -51,6 +51,13 @@ class Map; #define CF_SAFESTPOINT 128 #define CF_NO_DIFF_MASK 28 #define CF_CHECK_NAME 256 +#define CF_GOOD 512 +#define CF_LAW 1024 +#define CF_LADY 2048 +#define CF_MURDER 4096 +#define CF_FACTION 8192 +#define CF_TEAM 16384 + //spec ids flags #define AI_EA 0 #define AI_FACTION 1 @@ -93,6 +100,8 @@ struct CritterEntry { int Flags; //CF_IGNORENOSEE, CF_DEATHVAR, etc int TotalQuantity; //total number int SpawnCount; //create quantity + ieDword TimeOfDay; //spawn time of day (defaults to anytime) + ieByte DeathCounters[4]; //4 bytes }; /** @@ -148,14 +157,15 @@ private: SpawnEntry *eventspawns; void ReadCreature(DataFileMgr *inifile, - const char *crittername, CritterEntry &critter); + const char *crittername, CritterEntry &critter) const; void ReadSpawnEntry(DataFileMgr *inifile, - const char *entryname, SpawnEntry &entry); + const char *entryname, SpawnEntry &entry) const; //spawns a single creature - void SpawnCreature(CritterEntry &critter); + void SpawnCreature(CritterEntry &critter) const; void SpawnGroup(SpawnEntry &event); //gets the spec var operation code from a keyword - int GetDiffMode(const char *keyword); + int GetDiffMode(const char *keyword) const; + bool Schedule(ieDword appearance, ieDword gametime) const; public: /* called by action of the same name */ void SetNamelessDeath(const ieResRef area, Point &pos, ieDword state); ----------------------------------------------------------------------- This is an automated email from the git hooks/post-receive script. -- gemrb: Infinity Engine emulator |