From: Laszlo T. <ave...@us...> - 2004-07-27 21:28:22
|
Update of /cvsroot/gemrb/gemrb/gemrb/plugins/Core In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25772 Modified Files: GameControl.cpp GameControl.h Log Message: first implementation of party formations, doesn't handle orientation yet Index: GameControl.h =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/GameControl.h,v retrieving revision 1.45 retrieving revision 1.46 diff -C2 -d -r1.45 -r1.46 *** GameControl.h 21 Jul 2004 22:16:37 -0000 1.45 --- GameControl.h 27 Jul 2004 21:28:11 -0000 1.46 *************** *** 88,91 **** --- 88,92 ---- void ResizeDel(Window* win, unsigned char type); void ResizeAdd(Window* win, unsigned char type); + void ReadFormations(); unsigned char LeftCount, BottomCount, RightCount, TopCount; DialogState* ds; *************** *** 102,105 **** --- 103,107 ---- void UnhideGUI(); void TryToTalk(Actor *source, Actor *target); + void MoveToPointFormation(Actor *actor, int pos, int GameX, int GameY); void InitDialog(Actor* speaker, Actor* target, const char* dlgref); void EndDialog(bool try_to_break=false); Index: GameControl.cpp =================================================================== RCS file: /cvsroot/gemrb/gemrb/gemrb/plugins/Core/GameControl.cpp,v retrieving revision 1.151 retrieving revision 1.152 diff -C2 -d -r1.151 -r1.152 *** GameControl.cpp 26 Jul 2004 22:06:08 -0000 1.151 --- GameControl.cpp 27 Jul 2004 21:28:11 -0000 1.152 *************** *** 63,68 **** --- 63,78 ---- Animation* effect; + #define FORMATIONSIZE 10 + + typedef Point formation_type[FORMATIONSIZE]; + + int formationcount; + static formation_type *formations=NULL; + GameControl::GameControl(void) { + if(!formations) { + ReadFormations(); + } //this is the default action, individual actors should have one too //at this moment we use only this *************** *** 98,101 **** --- 108,155 ---- } + //actually the savegame contains some formation data too, how to use it? + void GameControl::ReadFormations() + { + TableMgr * tab; + int table=core->LoadTable("formatio"); + if(table<0) { + goto fallback; + } + tab = core->GetTable( table); + if(!tab) { + core->DelTable(table); + goto fallback; + } + formationcount = tab->GetRowCount(); + formations = (formation_type *) calloc(formationcount, sizeof(formation_type)); + for(int i=0; i<formationcount; i++) { + for(int j=0;j<FORMATIONSIZE;j++) { + int k=atoi(tab->QueryField(i,j*2)); + formations[i][j].x=k; + k=atoi(tab->QueryField(i,j*2+1)); + formations[i][j].y=k; + } + } + // + // read in formation data + // + core->DelTable(table); + return; + fallback: + formationcount = 1; + formations = (formation_type *) calloc(1,sizeof(formation_type) ); + } + + void GameControl::MoveToPointFormation(Actor *actor, int pos, int GameX, int GameY) + { + char Tmp[256]; + int formation=core->GetGame()->WhichFormation; + if(pos>=FORMATIONSIZE) pos=FORMATIONSIZE-1; + GameX+=formations[formation][pos].x*30; + GameY+=formations[formation][pos].y*30; + sprintf( Tmp, "MoveToPoint([%d.%d])", GameX, GameY ); + actor->AddAction( GameScript::GenerateAction( Tmp, true ) ); + } + GameControl::~GameControl(void) { *************** *** 774,781 **** actor->ClearPath(); actor->ClearActions(); char Tmp[256]; sprintf( Tmp, "MoveToPoint([%d.%d])", GameX, GameY ); actor->AddAction( GameScript::GenerateAction( Tmp, true ) ); ! } } --- 828,841 ---- actor->ClearPath(); actor->ClearActions(); + //formations should be honoured here + //generally a formation pattern is + //an array of offsets which alter the + //target coordinates based on 'i' + MoveToPointFormation(actor,i,GameX,GameY); + /* char Tmp[256]; sprintf( Tmp, "MoveToPoint([%d.%d])", GameX, GameY ); actor->AddAction( GameScript::GenerateAction( Tmp, true ) ); ! */ } } |