/*************************************************************************** * Copyright (C) 2008 by jrs0ul * * jrs0ul@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifdef WIN32 #ifdef _MSC_VER #pragma comment(lib,"SDL.lib") #pragma comment(lib,"SDLmain.lib") #pragma comment(lib,"OpenGl32.lib") #pragma comment(lib,"GLU32.lib") #pragma comment(lib,"openal32.lib") #ifdef _DEBUG #pragma comment(lib,"ogg_d.lib") #pragma comment(lib,"vorbis_d.lib") #pragma comment(lib,"vorbisfile_d.lib") #else #pragma comment(lib,"ogg.lib") #pragma comment(lib,"vorbis.lib") #pragma comment(lib,"vorbisfile.lib") #endif #endif #endif #ifdef WIN32 #ifdef _MSC_VER #include #include #include #else #include #include #include #endif #else #include #include #include #endif #include #include #include "Image.h" #include "TextureLoader.h" #include "Utils.h" #include "SoundSystem.h" #include "OggStream.h" #include "CIniFile.h" #include "Colors.h" #include "interpreter.h" #include "additional.h" #include "Klasses.h" #include "Races.h" #include "Creature.h" #include "Worldmap.h" #include "Inventory.h" #include "SpellData.h" #include "Party.h" #include "npc.h" #include "savegame.h" #include "Combat.h" #include "variables.h" #include "MonsterGroups.h" #include "code.h" #include "EnemyStrategy.h" #include "ModelCollection.h" #include "Camera.h" #include "gui/MenuLoader.h" #include "gui/Gui.h" #include "gui/BatlleSelect.h" #include "gui/TextScreen.h" #include "SystemConfig.h" #include "EventArray.h" #ifdef WIN32 #ifdef _DEBUG #include //ieskoti memory leaku #endif #endif //=================================== class HeroMaker{ //pagalbinis objektas kuriant herojus public: unsigned char htc; //HeroToCreate bool r; //race selected} bool s; //sex selected} bool c; //class selected} bool statsok; //kauliukai isridenti} bool done;//jau vardas uzrasytas} bool nexthero; bool faceselected; void reset(); }; //------------------------------------ void HeroMaker::reset(){ r=false; s=false; c=false; done=false; statsok=false; nexthero=false; faceselected=false; } //====================================== struct Camera{ int x; int y; Camera(){ x=0; y=0; } }; //------------------------------- struct ActiveFighter{ int partyIndex; //active fighter in party int activeFighter; //active fighter in Ent bool isEnemy; }; //========================================== struct CombatAnimationControl{ bool CombatAnimationRun; unsigned CombatFrame; unsigned MaxCombatFrame; CombatAnimationControl(){ MaxCombatFrame = 240; } int percent(){ return (int)ceil(CombatFrame/(MaxCombatFrame/100.0f));} }; //===================================GLOBALS ModelCollection arena; ModelCollection fighter; ModelCollection rodykle; ModelCollection skybox; DCamera Cam3D; const char version[]="0.800"; Uint32 tick = 0; SoundSystem SS; PicsContainer picsai; CIniFile INI; SDL_Joystick *Joy; OggStream Stream; unsigned char keys[7]={0}; //---godrpg kintamieji SpellData Burtai; //burtu infa ArmoryInfo Arminfo; KlassList klases; //Klasiu DB RaceList rases; //Rasiu DB ItemData itemData; //daiktu DB //heroju komanda Party jparty; //priesu komanda Party eparty; //atsargine komanda Party innparty; TextScreen Console,//bazine konsole conversation; //pokalbiu konsole ActiveFighter AF; int encounter_step;//kiek zingsniu iki kovos bool Mainmen,//ar reikia jungti title screena ir main menu?} CreatParty,//new game ?} bVisiKovesi, Fight, //on combat atacked, gexit, shut_down, weldone, gameover,//ar jau prakisom ?} next_step, action_sel, code_enter_enabled,code_enter, visible_enemy, no_enemy, first_time, atrakino, //jei duris atrakino} PartyControl //ar valdau party} ; Smenu hrace;//heroju rasiu meniu MenuLoader ML;/*Smenu* gmenus=0;*/ //pagrindiniai menu, tokie kaip cast,inventory..} Squad Entit; //4 parcio kovotojai ir 4 priesai kovos lauke Map map; MGroupList MonsterGroups; Viewport view; CombatAnimationControl CAnimControl; unsigned char snukis; //blet cia viskas del to globalizavimo :( Action PartyActions[4],EnemyActions[4]; unsigned char picc; unsigned char kd,df; HeroMaker hMaker;//siuo metu kuriamo herojaus makeris} SelectMeniu ActionSelect, //herojaus veiksmo pasirinkimo meniu kovojant innmeniu, //smukles meniu SmithMeniu, //kalves meniu merchantmeniu, //daiktu meniu InnPartyMeniu, wepm, //weaponry meniu stfm, //daiktu meniu gitemmeniu, //Itemsu meniu mieste orderselect, //nesikaunant veiksmo pasirinkimo meniu handleris invsel , //use, equip, give ... beqp, //lhand,rhand,armor} optmeniu, //options meniu:save, quit} spellmeniu, //veikejo turimu burtu meniu} quitmensel, //quit Y/N ? Mainmenu, //pagrindinis meniu} CreateHeroMeniu, //kuriamo herojaus meniu} racesel, //rases pasirinkimas kuriant heroju} sexsel, //lyties pasirinkimas kuriant heroju} classsel, //clases pasirinkimas kuriant heroju} SelectNewFace; FaceSelect partyfaces;//parcio snukiu selektorius BattleSelect Combatselect; SelectMeniu daiktasmeniu; //daikto meniu EditBox CodeEdit, //kodo ivedimo laukas NameEnter, //vardo ivedimas kuriant heroju itemcountedit; //kiek itemsu imsi int globalKEY,oldKEY; //globalus klavos statusas} unsigned char g_member, g_act, g_daiktas, g_item_count, //kiek daiktu duosim} g_oponent;//kolkas naudojami tarp meniu nesikaunant //shopo buy globalai: unsigned char gs_face, gs_daiktas, stam,itmw; //------------------------ bool HeroActionSelect; bool HeroActionDone; //----------------------------- int Pasirinkimas; //pasirinkimas kai kauniesi unsigned char HA_prieso_nr,HA_item; //pasirinkimai besikaunant bool SYSTEM_filesloaded=false; //ar pakrauta grafika ? int SYSTEM_imagefilescount=0; //kiek paveiksliuku krausim int mapposx,mapposy;//zemelapio pozicija ekrane NpcArray npcnation; CTreasure lobiai; bool ENCsmith,ENCmersh,ENCinn; EventArray ivykiai; //Ivykiai char currentmap[20]; bool victory;//ar laimejome kova bool ExeScript; char ScriptLine[100]; CreatureStatus talker; //pasnekovo veidas bool talk;//ar uzkalbino npc SystemConfig Sys; //system configuration settings float fader=1.0f; // fade in koeficientas CVariableArray Kintamieji; CCode Scriptas; int ScriptLineIndex=-1; int MapPushdirx=0; int MapPushdiry=0; int GlobalMapPushtimer=0; int MapPushsteps=0; Camera Cam; PicsContainer Tailsetas; int leftborder=0,rightborder=0; EnemyStrategy Strategy; int OldJoyX = 0; int OldJoyY = 0; int JoyX = 0; int JoyY = 0; //--------------------------- void Set3D(); void Set2D(); //---------------------------------- void QuitApp(){ Sys.quitApp = true; } //---------------------------------- void WriteLog(const char* text){ FILE * log; time_t rawtime; struct tm * timeinfo; time ( &rawtime ); timeinfo = localtime ( &rawtime ); puts(text); log = fopen("gamelog.txt","at+"); if (log){ char buf[100]; sprintf(buf,asctime(timeinfo)); buf[strlen(buf)-1]=0; fprintf(log,"%s||", buf); fprintf(log, "%s\n", text); fclose(log); } } //------------- void Interpret(const char* line); //DURU PROCEDUROS //========================================= void RestoreUnlockedDoors(){ //mapo object masyve map isvalo obstaclus for (int i=0;imap.width) view.pskx=map.width; //- view.psky=y+pusesizy; if (view.pskymap.height) view.psky=map.height; } //-------------------------------------------------- //X,Y MAPO kairiojo virsutnio kampo koordinates void DrawMap(int x,int y,int siz,int scrollnumx,int scrollnumy){ int i,a,man; unsigned char scx=0, scy=0; int x0=0; /*if (leftborder) x=-leftborder; if (rightborder) x=+rightborder;*/ if (view.pskx>view.sizx) x0=view.pskx-view.sizx; int y0=view.psky-view.sizy; //kai 1 spraitas juda smooth, kai 0 mapas juda if ((view.pskx==view.sizx)||(view.pskx==map.width)){ scx=1; } if ((view.psky==view.sizy)||(view.psky==map.height)){ scy=1; } /* if ((view.pskx==map.width)&&(leftborder<128)&&(scrollnumx>0)&&(view.sizx0)&&(scrollnumx<0)&&(view.sizx0)&&(scrollnumx>0)&&(view.sizx=0;man--){ if ((a==npcnation.npcs[man].y)&&(i==npcnation.npcs[man].x)) npcnation.npcs[man].draw( picsai, picsai.findpic(npcnation.npcs[man].spritename), view, x,y, scrollnumx*(1-scx),scrollnumy*(1-scy)); /* char buf[10]; sprintf(buf,"%d",npcnation.npcs[man].ID); WriteText(x+(npcnation.npcs[man].x-x0+1)*siz-(scrollnumx*(1-scx)), y+(npcnation.npcs[man].y-y0)*siz-(scrollnumy*(1-scy)), D3D.spraitas,picsai.findpic("charai.tga") ,buf); */ } } } for (a=y0;a1) sprintf(buf,"f%d%s.tga",partis.m[i].sex,rases.rases[partis.m[i].race].name); else sprintf(buf,"f%s.tga",rases.rases[partis.m[i].race].name); prt[i].change(x+ix,y+iy,partis.m[i].name,picsai.findpic(buf),partis.m[i].faceID); prt[i].showhpmp=visible; prt[i].enemyface=enemy; prt[i].dead=partis.m[i].dead; prt[i].poisoned=partis.m[i].poisoned; prt[i].mp.def=partis.m[i].mp.def; prt[i].hp.def=partis.m[i].hp.def; prt[i].mp.max=partis.m[i].mp.max; prt[i].hp.max=partis.m[i].hp.max; prt[i].draw(picsai, picsai.findpic("status.tga"),picsai.findpic("mark.tga"),picsai.findpic("charai.tga")); if (!vertical) ix=ix+70; else iy=iy+75; } } //-----------------------------------------------} //sugeneruoja prieshu party, expas naudojamas kaip random(expas)+100} void EnemyGenerate( Party& part, MonsterGroup& galimipriesai){ unsigned char names[4]; char l; char n[10]; part.count=galimipriesai.mcount; part.alive=part.count; for (int i=0;i<4;i++) names[i]=0; for (int a=0;a3) strcpy(n,rases.rases[part.m[a].race].name); else strcpy(n,klases.jobs[part.m[a].klass].name); if (names[part.m[a].klass]>1) sprintf(n,"%s%c",n,l); strcpy(part.m[a].name,n); if (strlen(part.m[a].name)>8) { part.m[a].name[7]='\0'; if (names[part.m[a].klass]>1) part.m[a].name[6]=l; } part.m[a].rollDice(rases,klases); //ginklai & itemsai part.m[a].inventory.clear(); if (part.m[a].klass!=3) { int moneycount=rand()%20; Item tmp; tmp.set("gold coin",0,1,itemData); for (int i=0;icasterparty.m[casterindex].level()){ spell++; spellindex=klases.jobs[casterparty.m[casterindex].klass].spls[spell]; }*/ if (Burtai.spells[spellindex].cost>casterparty.m[casterindex].mp.def) Console.putText("not enough MP"); else { sprintf(buf,"%s tried to cast %s",casterparty.m[casterindex].name,Burtai.spells[spellindex].name); Console.putText(buf); if (strcmp(Burtai.spells[spellindex].codeline,".")!=0){ int oponent=0; if(&oponentpartis==&jparty) oponent=oponentindex; else oponent=jparty.count+oponentindex; sprintf(buf,"Let(\"oponent\",\"%d\")",oponent); Interpret(buf); int caster=0; if(&casterparty==&jparty) caster=casterindex; else caster=jparty.count+casterindex; sprintf(buf,"Let(\"caster\",\"%d\")",caster); Interpret(buf); sprintf(buf,"Let(\"casterMagP\",\"%d\")",casterparty.m[casterindex].magp); Interpret(buf); Interpret(Burtai.spells[spellindex].codeline); use=true; } if (use) { casterparty.m[casterindex].mp.def=casterparty.m[casterindex].mp.def-Burtai.spells[spellindex].cost; if ((oponentpartis.m[oponentindex].hp.def<=0)&&(!oponentpartis.m[oponentindex].dead)) { oponentpartis.killMember(oponentindex); sprintf(buf,"%s died",oponentpartis.m[oponentindex].name); Console.putText(buf); } } } } //---------------------------------------------------------------- void UseItem( Padaras& crtr, unsigned int itemID, Party& partis, unsigned char index){ char buf[40]; bool use=false; Item* itm=crtr.inventory.getItem(itemID); if (strcmp(partis.m[index].name,crtr.name)==0){ sprintf(buf,"%s tried %s",crtr.name,itemData.info[itm->kind].name); Console.putText(buf); } else{ sprintf(buf,"%s tried %s on %s",crtr.name,itemData.info[itm->kind].name,partis.m[index].name); Console.putText(buf); } if (strcmp(itemData.info[itm->kind].actionscript,".")!=0){ int oponent=0; if(&partis==&jparty) oponent=index; else oponent=jparty.count+index; char buf[20]; sprintf(buf,"Let(\"oponent\",\"%d\")",oponent); Interpret(buf); Interpret(itemData.info[itm->kind].actionscript); use=true; } if (use) { crtr.inventory.removeItem(itemID); if (partis.m[index].hp.def<=0) { partis.killMember(index); sprintf(buf,"%s died.",partis.m[index].name); Console.putText(buf); } } } //-------------------------------------- void LevelUpMessage( Padaras& crtr, int oldlev){ //kai pakyla i kita lygi char buf[80]; int lev=crtr.level(); sprintf(buf,"%s goes to %d level !",crtr.name,lev); Console.putText(buf); int hp=crtr.hp.max; int mp=crtr.mp.max; int at=crtr.atck; int df=crtr.defn; int ag=crtr.agil; int mg=crtr.magp; int sp=crtr.sprt; for (int i=0;i<(lev-oldlev);i++) crtr.levelUp(rases,klases); int spelsenabled=crtr.enablespells(klases,Burtai); sprintf(buf,"%d spells enabled!#",spelsenabled); Console.putText(buf); hp=crtr.hp.max-hp; mp=crtr.mp.max-mp; at=crtr.atck-at; df=crtr.defn-df; ag=crtr.agil-ag; mg=crtr.magp-mg; sp=crtr.sprt-sp; sprintf(buf,"hp + %d mp + %d atck + %d",hp,mp,at); Console.putText(buf); sprintf(buf,"def +%d agil +%d",df,ag); Console.putText(buf); sprintf(buf,"magp + %d sprt + %d",mg,sp); Console.putText(buf); } //---------------------------------- void send_call(const char* itemName, const char* textas,unsigned char kas){ if (!eparty.m[kas].helpme.needhelp) { eparty.m[kas].helpme.needhelp=true; for (int i=0;ispells[i].index==spellindex)&&(dude->spells[i].enabled)) return true; } return false; } //---------------------------------------------------- //Monstru AI void EnemyAI(unsigned char kas, EnemyStrategy& strategy ){ unsigned char caleris=0; char buf[40]; unsigned char a,i; Padaras* enemy = &eparty.m[kas]; //nuoroda i priesa bool sveikas=false; int alert_hp=(enemy->hp.max/100)*50; int alert_mp=(enemy->mp.max/100)*50; if (enemy->on_defense) eparty.m[kas].on_defense=false; unsigned char c=0; if ((enemy->helpme.called) && (Strategy.helpFriends)) c=enemy->inventory.findItemByName(enemy->helpme.wantedItem,itemData); // int mpup=enemy->inventory.findItemByName("small magic up",itemData); int priesnuodis=enemy->inventory.findItemByName("antidote",itemData); int hpup=enemy->inventory.findItemByName("small hp up",itemData); int nuodai=enemy->inventory.findItemByName("poison",itemData); //mp up if (((enemy->klass==1)||(enemy->klass==2))&& ((enemy->mp.def<=alert_mp))){ if (strategy.useSpellForMp){ if (IsSpellAvailable(enemy,strategy.spellsForMp[0])&& (enemy->mp.def>=Burtai.spells[strategy.spellsForMp[0]].cost)) CastSpell(strategy.spellsForMp[0],eparty,kas,jparty,PickVictim(false)); } else if (Strategy.useItemForMp){ int item_=enemy->inventory.findItem(Strategy.itemsForMp[0]); if (item_!=-1) UseItem(*enemy,item_,eparty,kas); } } else //******** pagalba ************* if ((eparty.m[kas].helpme.called)&&(c)) pagalba(kas,"small hp up",caleris); else //********nuodu gydimas******************** if ((eparty.m[kas].poisoned)&& (((eparty.m[kas].klass==1)&&(eparty.m[kas].mp.def>=Burtai.spells[4].cost)) ||(priesnuodis!=-1)|| (eparty.m[kas].helpme.needhelp=false))) { if ((eparty.m[kas].klass==1)&&(eparty.m[kas].mp.def>=Burtai.spells[4].cost)) CastSpell(2,eparty,kas,eparty,kas); else if (priesnuodis!=-1) { UseItem(eparty.m[kas],priesnuodis,eparty,kas); } else send_call("antidote","cure",kas); } else //********* gydimas+ginyba ******** if ((eparty.m[kas].hp.def<=alert_hp)&& (((eparty.m[kas].klass==1)&&(eparty.m[kas].mp.def>=Burtai.spells[1].cost)) ||(hpup!=-1)||(eparty.m[kas].helpme.needhelp==false))) { if ((eparty.m[kas].klass==1)&&(eparty.m[kas].mp.def>=Burtai.spells[1].cost)) CastSpell(1,eparty,kas,eparty,kas); else if (hpup!=-1) { UseItem(eparty.m[kas],hpup,eparty,kas); } else send_call("small hp up","heal",caleris); } else if (eparty.m[kas].hp.def<(int)((eparty.m[kas].hp.max/100)*10)) { eparty.m[kas].defend(); sprintf(buf,"%s sets defense",eparty.m[kas].name); Console.putText(buf); } //*********************** else //castinam bolt if ((eparty.m[kas].klass==2)&&(eparty.m[kas].mp.def>Burtai.spells[7].cost) && (eparty.m[kas].spells[4].enabled)) { a=PickVictim(true); CastSpell(4,eparty,kas,jparty,a); EnemyActions[kas].cst=true; EnemyActions[kas].op=a; PartyActions[a].magicefect=true; } else if (nuodai!=-1) { //ar as turiu nuodu ? i=0; while ((i!=jparty.count)&&(!sveikas)) { if ((!jparty.m[i].poisoned)&&(!jparty.m[i].dead)) sveikas=true; i++; } if (sveikas) { UseItem(*enemy,nuodai,jparty,i-1); } } else //atack if (jparty.alive) { a=PickVictim(true); EnemyActions[kas].atc=true; EnemyActions[kas].op=a; ataka(eparty.m[kas],jparty.m[a]);//ataka grazina kazka if (jparty.m[a].hp.def<=0) { jparty.killMember(a); sprintf(buf,"%s died",jparty.m[a].name); Console.putText(buf); } } poison_works(eparty,kas); } //------------------------------------------------------------------------ //sukuria veikejo turimu itemsu meniu void CreateItemsMeniu(unsigned int x,unsigned int y, SelectMeniu& ItemsMeniu, Padaras& dude){ char countstr[5]; char buf[30]; Smenu meniu; for (int i=0;icount)>1) sprintf(countstr,"%d",itm->count); else strcpy(countstr,""); if ((itemData.info[itm->kind].isweapon)||(itemData.info[itm->kind].isarmor)){ sprintf(meniu.opt[i],"%-3s %-s %d%c",countstr,itemData.info[itm->kind].name,itm->health,'%'); if (itemData.info[itm->kind].isarmor) meniu.pics[i]=2; else meniu.pics[i]=1; } else sprintf(meniu.opt[i],"%-3s %s",countstr,itemData.info[itm->kind].name); } meniu.count=dude.inventory.itemGroupsCount(); sprintf(buf,"%s's inventory:",dude.name); ItemsMeniu.init(x,y,buf,meniu,0,150); } //----------------------------------------------- void CreateSpellMeniu( SelectMeniu& selectmeniu, Padaras& dude){ Smenu meniu; int count=0; for (int i=0; im[sel].dead) { ataka(jparty.m[kas], party->m[sel]); if (party->m[sel].hp.def <= 0) { party->killMember(sel); char buf[20]; sprintf(buf,"%s died.",party->m[sel].name); Console.putText(buf); } Combatselect.reset(); baigta=true; } else Combatselect.reset(); } } //---------------------------------------------------- void S_Cast(unsigned char kas,bool& baigta){ if (!spellmeniu.selected) { spellmeniu.activate(); spellmeniu.getInput(globalKEY); } else { spellmeniu.deactivate(); if (!Combatselect.selected) Combatselect.getinput(globalKEY, Entit); else { PartyActions[kas].cst=true; PartyActions[kas].op = Combatselect.state; if (PartyActions[kas].op>3) EnemyActions[PartyActions[kas].op-4].magicefect=true; else PartyActions[PartyActions[kas].op].magicefect=true; HA_prieso_nr = Combatselect.state; Combatselect.reset(); if (HA_prieso_nr>jparty.count-1) { CastSpell(spellmeniu.selection.ids[spellmeniu.state],jparty,kas,eparty,HA_prieso_nr-jparty.count); } else CastSpell(spellmeniu.selection.ids[spellmeniu.state],jparty,kas,jparty,HA_prieso_nr); baigta=true; spellmeniu.reset(); } } } //'''''''''''''''''''''''' void S_Use(unsigned char kas, bool& baigta){ if (HA_prieso_nr==255) { if (!daiktasmeniu.selected) { daiktasmeniu.activate(); daiktasmeniu.getInput(globalKEY); if (daiktasmeniu.selected) { daiktasmeniu.deactivate(); HA_item=daiktasmeniu.state; Combatselect.state=0; } } else { if (!Combatselect.selected) { Combatselect.getinput(globalKEY, Entit); if (Combatselect.selected) { HA_prieso_nr = Entit.fighters[Combatselect.state].nr; Combatselect.reset(); } } } } else { if (HA_prieso_nr>jparty.count-1) UseItem(jparty.m[kas],HA_item,eparty,HA_prieso_nr-jparty.count); else UseItem(jparty.m[kas],HA_item,jparty,HA_prieso_nr); baigta=true; } } //---------------------------------------------- //herojaus veiksmu pasirinkimas kovojant} void HeroAction(int kas, bool& baigta){ unsigned char eag;//enemy agil unsigned char ecount;//enemy count unsigned char agiavg; char buf[50]; //'''''''''''''''''''''''' if (jparty.m[kas].on_defense) jparty.m[kas].on_defense=false; if (!ActionSelect.selected) { //Ar pasirinkom kažką ? ActionSelect.activate(); ActionSelect.getInput(globalKEY); if (ActionSelect.selected) { Pasirinkimas = ActionSelect.state; ActionSelect.deactivate(); if (jparty.m[kas].klass==0) //warrioris negali rinktis cast if (Pasirinkimas > 0) Pasirinkimas++; } } else { switch(Pasirinkimas){ case 0:S_Atck(kas,baigta); break;//atack case 1:S_Cast(kas,baigta); break; //jei pasirinko cast case 2:{ jparty.m[kas].defend(); sprintf(buf,"%s sets defense",jparty.m[kas].name); Console.putText(buf); baigta=true; } break; case 3:S_Use(kas,baigta); break; //use case 4:{ eag=0; ecount=0; for (int i=1;iagiavg) { sprintf(buf,"%s runs away",jparty.m[kas].name); Console.putText(buf); jparty.m[kas].escaped=true; jparty.present--; } else{ sprintf(buf,"%s cannot escape",jparty.m[kas].name); Console.putText(buf); } baigta=true; } break; case 5:{ sprintf(buf,"%s skips turn"); Console.putText(buf); baigta=true; } } } if (ActionSelect.canceled) gexit=true; } //------------------------------------------- void EquipItem(unsigned char sav, unsigned int itemmeniuindex, Item& antko,bool isweapon){ Item* itm=jparty.m[sav].inventory.getItem(itemmeniuindex); int itemID=itm->kind; if (antko.kind!=-1) Console.putText("Must unequip first"); else { if (((!itemData.info[itemID].isarmor)&&(!itemData.info[itemID].isweapon))|| ((itemData.info[itemID].isarmor)&&(isweapon))||((itemData.info[itemID].isweapon)&&(!isweapon)) ||(jparty.m[sav].atck+Arminfo.wepsnarmor[Arminfo.findByIndex(itemID)].dmg<0) ||(jparty.m[sav].defn+Arminfo.wepsnarmor[Arminfo.findByIndex(itemID)].def<0) ||(jparty.m[sav].agil+Arminfo.wepsnarmor[Arminfo.findByIndex(itemID)].agil<0)) Console.putText("You can't equip this"); else { antko.set(itemID,itm->health,itm->count); jparty.m[sav].inventory.removeItem(itemmeniuindex); char buf[40]; sprintf(buf,"%s equips %s",jparty.m[sav].name,itemData.info[antko.kind].name); Console.putText(buf); } } } //------------------------------------------------------ //unequipina itema, cia place yra ranka ar armoras} void UnequipItem(unsigned char kas, Item& place){ if (place.kind!=-1) { Item tmp; tmp.set(place.kind,place.health,place.count); jparty.m[kas].inventory.addItem(&tmp,itemData); place.set(-1,0,0); } else Console.putText("Must equip first"); } //---------------------------------------------------------- //Nesikaunant tarp meniu yra tokia opcija inventory void Inventorius( bool& activated){ int tmp=0; char buf[50]; //'''''''''''''''''''''''''''''''''''''' if (g_member==255) { partyfaces.getInput(globalKEY,jparty); //pasirenkame heroju partyfaces.activate(); if (partyfaces.selected) { partyfaces.deactivate(); g_member=partyfaces.face; CreateItemsMeniu(200,90,daiktasmeniu,jparty.m[g_member]); partyfaces.reset(jparty); } else if (partyfaces.canceled) { activated=false; partyfaces.reset(jparty); } } else if ((!daiktasmeniu.selected)&&(!daiktasmeniu.canceled)) { daiktasmeniu.getInput(globalKEY); if (daiktasmeniu.selected) { g_daiktas=daiktasmeniu.state; partyfaces.skipdead=false; partyfaces.reset(jparty); } } else { if (daiktasmeniu.canceled) { activated=false; partyfaces.reset(jparty); } if (g_act==255) { //pasirenkame ka darysim su invent. invsel.getInput(globalKEY); if (invsel.selected) { g_act=invsel.state; //jei pasirinkome ka nors invsel.reset(); } } else { switch(g_act){ case 0:{ //use if (!partyfaces.selected) { partyfaces.getInput(globalKEY,jparty); partyfaces.activate(); if (partyfaces.selected){ g_oponent=partyfaces.face; partyfaces.deactivate(); } } if (g_oponent!=255) { UseItem(jparty.m[g_member],g_daiktas,jparty,g_oponent); activated=false; daiktasmeniu.reset(); g_oponent=255; } } break; case 1: { //Equip if (!beqp.selected) { beqp.activate(); beqp.getInput(globalKEY); } else { beqp.deactivate(); Item* itm=jparty.m[g_member].inventory.getItem(g_daiktas); switch(beqp.state){ case 0:EquipItem(g_member,g_daiktas,jparty.m[g_member].lhand,true); break; case 1:EquipItem(g_member,g_daiktas,jparty.m[g_member].rhand,true); break; case 2:EquipItem(g_member,g_daiktas,jparty.m[g_member].armor,false); } //cia act daiktas kuri equipini beqp.reset(); daiktasmeniu.reset(); activated=false; } } break; case 2:{ //Give Item* itm=jparty.m[g_member].inventory.getItem(daiktasmeniu.state); if (g_oponent==255) { partyfaces.getInput(globalKEY,jparty); partyfaces.activate(); g_oponent=255; if (partyfaces.selected) { g_oponent=partyfaces.face; partyfaces.deactivate(); g_item_count=1; strcpy(itemcountedit.text,"1"); partyfaces.reset(jparty); } } else if ((!itemcountedit.entered)&&(itm->count>1)) { //kiek duosim itemcountedit.getInput(globalKEY); if (itemcountedit.entered) { g_item_count=atoi(itemcountedit.text); if ((tmp)||(g_item_count>itm->count)) itemcountedit.entered=false; } } else { itemcountedit.reset(); Item* tmp=jparty.m[g_member].inventory.getItem(daiktasmeniu.state); int state=tmp->kind; if (jparty.m[g_member].giveItems( jparty.m[g_oponent],daiktasmeniu.state, g_item_count, itemData)) { sprintf(buf,"%s puts %d %s into bag", jparty.m[g_oponent].name,g_item_count,itemData.info[state].name); Console.putText(buf); g_oponent=255;//resetas g_daiktas=255; } else{ sprintf(buf,"%s cannot carry more",jparty.m[g_oponent].name); } activated=false; daiktasmeniu.reset(); } } break; case 3:{ //throw Item* itm=jparty.m[g_member].inventory.getItem(daiktasmeniu.state); sprintf(buf,"%s throws %s away",jparty.m[g_member].name,itemData.info[itm->kind].name); Console.putText(buf); jparty.m[g_member].inventory.removeItem(daiktasmeniu.state); activated=false; daiktasmeniu.reset(); } break; default: activated=false; } } } if (invsel.canceled) { g_member=255; g_act=255; partyfaces.reset(jparty); //jei atsaukem inv meniu invsel.reset(); } //''''''''''''''''''''''''''''''''''''' if (! activated) { invsel.reset(); g_member=255; g_act=255; } } //---------------------------------- void ExitYesNo(){ //cia siap kodo blokas} quitmensel.getInput(globalKEY); if ((quitmensel.selected)&&(quitmensel.state!=0)) gexit=false; } //-------------------------------------- void TakeBooty(){ //kai nugali prieshus pasiimi ju daiktus unsigned char count; Inventory enm_stuff, //visi nugaletu priesu daiktai tmpstuff; int b=0, w=0; for (b=0;bcount;a++) enm_stuff.addItem(tmp,itemData); } Item wep; if (eparty.m[b].lhand.kind!=-1){ wep.set(eparty.m[b].lhand.kind,eparty.m[b].lhand.health,eparty.m[b].lhand.count); enm_stuff.addItem(&wep,itemData); } if (eparty.m[b].rhand.kind!=-1){ wep.set(eparty.m[b].rhand.kind,eparty.m[b].rhand.health,eparty.m[b].lhand.count); enm_stuff.addItem(&wep,itemData); } if (eparty.m[b].armor.kind!=-1){ wep.set(eparty.m[b].armor.kind,eparty.m[b].armor.health,eparty.m[b].armor.count); enm_stuff.addItem(&wep,itemData); } } //Visi nugaletu pabaisu daiktai sumesti i enm_stuff if (enm_stuff.itemGroupsCount()>0) { for (int i=0;icount; for (int a=0;a1){ sprintf(buf,"%s gains %d %s",jparty.m[i].name,count,itemData.info[tmp->kind].name); Console.putText(buf); } else{ sprintf(buf,"%s gains %s",jparty.m[i].name,itemData.info[tmp->kind].name); Console.putText(buf); } } } } } Console.putText("press a key..."); tmpstuff.clear(); enm_stuff.clear(); } //----------------------------------- void OnVictory(){ int dalis,liko; char buf[50]; Console.putText("Party defeated all enemies !"); int expr=0; int pexp=0; int pinigai=0; for (int i=0;i0){ sprintf(buf,"Each gains %d gold",dalis); Console.putText(buf); } for (int i=0;i1) sprintf(buf,"Let(\"hero%dface\",\"f%d%s.tga\")",i,jparty.m[i].sex,rases.rases[jparty.m[i].race].name); else sprintf(buf,"Let(\"hero%dface\",\"f%s.tga\")",i,rases.rases[jparty.m[i].race].name); Interpret(buf); sprintf(buf,"Let(\"hero%dfaceID\",\"%d\")",i,jparty.m[i].faceID); Interpret(buf); } LoadCurrentMap(jparty.x,jparty.y,currentmap); npcnation.npcs[npcnation.count-1].x=jparty.x; npcnation.npcs[npcnation.count-1].y=jparty.y; RestoreUnlockedDoors(); //pataisyk sita } } //-------------------------------------- //sukuria ginklu ir itemu pirkimo menu void InitBuyMenus( SelectMeniu& sec1, SelectMeniu& sec2){ Smenu stf, //daiktai wep; //weaponry for (int i=0;i<12;i++) sprintf(stf.opt[i],"%s %dG",itemData.info[i].name,itemData.info[i].cost); stf.count=11; for (int i=12;i<22;i++){ sprintf(wep.opt[i-12],"%s %dG",itemData.info[i].name,itemData.info[i].cost); } wep.count=10; sec1.init(300,10,"",wep,1); sec2.init(300,10,"",stf,1); } //------------------------------------------------- //jei rushis 2 tai ginklai jei 1 tai daiktai void BuyItem (unsigned char rushis, bool& stop) { //perkame itemsus unsigned char moneyplace,money; if (gs_face==255) { partyfaces.getInput(globalKEY,jparty); partyfaces.activate(); if (partyfaces.selected) { gs_face=partyfaces.face; partyfaces.deactivate(); money=jparty.m[gs_face].inventory.getItemCount(11); sprintf(wepm.title,"%s %dG buy:",jparty.m[gs_face].name,money); sprintf(stfm.title,"%s %dG buy:",jparty.m[gs_face].name,money); partyfaces.reset(jparty); } } else { switch(rushis) { case 1:{ stfm.activate(); stfm.getInput(globalKEY); if (stfm.selected) stfm.deactivate(); } break; case 2:{ wepm.activate(); wepm.getInput(globalKEY); if (wepm.selected) wepm.deactivate(); } break; } } if ((wepm.selected)||(stfm.selected)||(partyfaces.canceled)) { if (wepm.selected) gs_daiktas=wepm.state+12; if (stfm.selected){ gs_daiktas=stfm.state; stfm.deactivate(); } if (jparty.m[gs_face].inventory.itemWeight(itemData)+itemData.info[gs_daiktas].weight <=jparty.m[gs_face].stamina()) { if (gs_daiktas!=255) { money=jparty.m[gs_face].inventory.getItemCount(11); if (money-itemData.info[gs_daiktas].cost>=0) { char buf[50]; sprintf(buf,"%s bought %s for %d#",jparty.m[gs_face].name,itemData.info[gs_daiktas].name, itemData.info[gs_daiktas].cost); Console.putText(buf); Item tmp; tmp.set(gs_daiktas,100,1); jparty.m[gs_face].inventory.addItem(&tmp,itemData); moneyplace=jparty.m[gs_face].inventory.findItemByName("gold coin",itemData); for (int i=0;i1)) { itemcountedit.getInput(globalKEY); itemcountedit.draw(picsai,picsai.findpic("charai.tga"),picsai.findpic("frm.tga")); if (itemcountedit.entered) { g_item_count=atoi(itemcountedit.text); if ((tmp)||(g_item_count>jparty.m[partyfaces.face].inventory.getItemCount(gitemmeniu.state))) itemcountedit.entered=false; } } else { stop=true; Item* tmp=jparty.m[partyfaces.face].inventory.getItem(gitemmeniu.state); itm=tmp->kind; char buf[50]; sprintf(buf,"%s sold %d %s for %dG#",jparty.m[partyfaces.face].name,g_item_count,itemData.info[itm].name, g_item_count*(itemData.info[itm].cost-1)); Console.putText(buf); Item gold; gold.kind=11; for (int i=0;i<(itemData.info[itm].cost-1)*g_item_count;i++) jparty.m[partyfaces.face].inventory.addItem(&gold,itemData);//kad pigiau nupirktu :) for (int i=0;ivariables[0]); unsigned short y=atoi(args->variables[1]); Cam.x=x; Cam.y=y; MoveCamera(Cam.x,Cam.y,view); } //----------------------------------- //nedabaigta void CMD_PUSHCAM(const Arguments* args){ int dirx,diry,step; dirx=atoi(args->variables[0]); diry=atoi(args->variables[1]); step=atoi(args->variables[2]); MapPushdirx=dirx; MapPushdiry=diry; MapPushsteps=step; } //----------------------------------- //Interpretoja komanda MovNpc(x,y) //cia x,y naujos npc koordinates void CMD_MVNPC(const Arguments* args){ int id=atoi(args->variables[0]); int x=atoi(args->variables[1]); int y=atoi(args->variables[2]); if ((id<=npcnation.count)) { npcnation.npcs[id].movexy(x,y,npcnation); } } //------------------------------------ //Interpretoja komanda PushNpc(sprID,dir,count) void CMD_PSNPC(const Arguments* args){ unsigned char id=atoi(args->variables[0]); unsigned char diras=atoi(args->variables[1]); unsigned char count=atoi(args->variables[2]); if ((id<=npcnation.count)&&(npcnation.npcs[id].stepcount==1)) { npcnation.npcs[id].timeris=0; npcnation.npcs[id].stepcount=count; npcnation.npcs[id].redir(diras,npcnation); } } //------------------------------------------ void CMD_RESTOREHP(const Arguments* args){ int oponent=atoi(args->variables[0]); int points=atoi(args->variables[1]); int dif=0; if (oponentvariables[0]); int points=atoi(args->variables[1]); int dif=0; if (oponentvariables[0]); if (oponentvariables[0]); int percent=atoi(args->variables[1]); if (oponentvariables[0]); int power=atoi(args->variables[1]); char buf[50]; int dmg=0; if (oponentvariables[2]); sprintf(buf,"%s cause %dp dmg to %s",args->variables[2],dmg,jparty.m[oponent].name); } else{ dmg=eparty.m[oponent-jparty.count].elementalDamage(power,args->variables[2]); sprintf(buf,"%s cause %dp dmg to %s",args->variables[2],dmg,eparty.m[oponent-jparty.count].name); } Console.putText(buf); } //----------------------------------------- void CMD_ANTIDOTE(const Arguments* args){ int oponent=atoi(args->variables[0]); if (oponentvariables[1]); conversation.putText(buf); talker.change(conversation.getX()-70,conversation.getY(), args->variables[0],picsai.findpic(args->variables[2]),atoi(args->variables[3])); return 0; } else return 1; } //-------------------------------------------- //if(someth=someth) void CMD_IF(const char * cmdline, unsigned char cmdlen){ unsigned char i; char val1[20]; char val2[20]; WriteLog("It's if..."); if (cmdline[cmdlen]=='(') { i=cmdlen+1; char sep=0; GetValue(cmdline,i,"=",val1,&sep); GetValue(cmdline,i,")",val2,&sep); if (val1!="" ){ WriteLog(val1); WriteLog(val2); char* reiksme=Kintamieji.getValue(val1); if (reiksme){ if (strcmp(reiksme,val2)!=0){ if (ScriptLineIndex < Scriptas.code.count()) ScriptLineIndex++; } }else ScriptLineIndex++; } } } //----------------------------------------- // Exec(somescript.txt) void CMD_EXE(const Arguments* args){ char buf[255]; sprintf(buf, "executing %s ...", args->variables[0]); WriteLog(buf); Scriptas.clear(); bool res=Scriptas.load(args->variables[0]); if (res) { ExeScript=true; ScriptLineIndex=-1; strcpy(ScriptLine,""); } else WriteLog("script fails?"); } //-------------------- void CMD_GOTO(const Arguments* args){ WriteLog("it's go to :)"); WriteLog(args->variables[0]); int sk=atoi(args->variables[0]); ScriptLineIndex=sk-1; } //-------------------- //give(PartyMember,itemID,E) gives E items to PartyMember void CMD_GIVE(const Arguments* args){ int dudeID = atoi(args->variables[0]); int itemID = atoi(args->variables[1]); int count = atoi(args->variables[2]); if ((dudeID>=0)&&(dudeID<4)) if ((itemID0)) { Item item; if ((itemData.info[itemID].isweapon)||(itemData.info[itemID].isarmor)) item.set(itemID,100,1); else item.set(itemID,0,1); for(int i=0;ivariables[0]); int exp=atoi(args->variables[1]); if ((dudeID > -1) && (dudeID < jparty.count)){ char buf[255]; sprintf(buf,"%s gains %d exp",jparty.m[dudeID].name,exp); Console.putText(buf); if ((jparty.m[dudeID].needexp()<=exp)&&(jparty.m[dudeID].level()<100)) { int oldlev=jparty.m[dudeID].level(); jparty.m[dudeID].exp+=exp; LevelUpMessage(jparty.m[dudeID],oldlev); } else if (jparty.m[dudeID].needexp()>exp) jparty.m[dudeID].exp+=exp; } else WriteLog("Bad hero index"); } //--------------------- //pakrauna zemelapi void CMD_LoadMap(const Arguments* args){ unsigned char x=atoi(args->variables[0]); unsigned char y=atoi(args->variables[1]); LoadCurrentMap(x,y,args->variables[2]); } //------------------------- //AddNpc(x,y,sprite) void CMD_ADDNPC(const Arguments* args){ unsigned char x = atoi(args->variables[0]); unsigned char y = atoi(args->variables[1]); unsigned char type = atoi(args->variables[2]); Npc newman; newman.init(x,y,type,npcnation.count+1,"",args->variables[3]); npcnation.add(newman); newman.clear(); } //-------------------------- void CMD_REMOVENPC(const Arguments* args){ int id=atoi(args->variables[0]); npcnation.kill(id); } //------------------------ //atjungia playerio valdyma void CMD_NOJOY(){ WriteLog("No joy :("); if (PartyControl) PartyControl=false; else PartyControl=true; } //------------------- void CMD_DESERT(){ if (!no_enemy) { Console.putText("no enemy on"); no_enemy=true; } else { Console.putText("no enemy off"); no_enemy=false; jparty.steps=0; } } //------------------ void CMD_INTERNET(){ if (!visible_enemy) { visible_enemy=true; Console.putText("visible enemy stat on"); } else { visible_enemy=false; Console.putText("visible enemy stat off"); } } //------------------- void CMD_WRITE(const Arguments* args){ Console.putText(args->variables[0]); } //--------------------- void CMD_FIGHT(const Arguments* args){ puts("Let's fight"); if (args->count<=0) puts("Not enough arguments"); else{ int index=atoi(args->variables[0]); Encounter(index); } } //---------------------------- void CMD_LET(const Arguments* args){ CVariable var(args->variables[0],args->variables[1]); Kintamieji.add(var); var.destroy(); } //--------------------------------------- void CMD_ADDPMEMB(const Arguments* args){ Padaras pad; pad.loadFromFile(args->variables[0],klases,Burtai); jparty.addMember(pad); } //------------------------------------------------ void Interpret(const char* line){ char cmd[50]; unsigned char index=0; Arguments args; if ((int)strlen(line)>=1){ if (!((line[0]=='/')&&(line[1]=='/'))){ GetCommand(line,cmd);//gauna komanda if (line[(int)strlen(cmd)]=='(') if (strcmp(cmd,"if")!=0) args.getArguments(line,(int)strlen(cmd),&Kintamieji); unsigned char cmdlen=(unsigned char)strlen(cmd); /*char tmp[10]; if (strcmp(cmd,"Let")!=0){ sprintf(tmp,"cmd len:%d",strlen(cmd)); WriteLog(cmd); WriteLog(tmp); }*/ if (strcmp(cmd,"desert")==0) //Nera prieshu CMD_DESERT(); else if (strcmp(cmd,"fight")==0) //pasikaukim CMD_FIGHT(&args); else if (strcmp(cmd,"internet")==0) //matosi statusai prieshu CMD_INTERNET(); else if (strcmp(cmd,"Write")==0) CMD_WRITE(&args); else if (strcmp(cmd,"inject")==0) CMD_Inject(&args); else if (strcmp(cmd,"PushNpc")==0) CMD_PSNPC(&args); else if (strcmp(cmd,"PushCam")==0) CMD_PUSHCAM(&args); else if (strcmp(cmd,"MovCam")==0) CMD_MVCAM(&args); else if (strcmp(cmd,"MovNpc")==0) CMD_MVNPC(&args); else if (strcmp(cmd,"Exitp")==0) shut_down=true; else if (strcmp(cmd,"Exec")==0) CMD_EXE(&args); else if (strcmp(cmd,"if")==0) CMD_IF(line,(int)strlen(cmd)); else if (strcmp(cmd,"Say")==0) CMD_SAY(&args); else if (strcmp(cmd,"NoJoy")==0) CMD_NOJOY(); else if (strcmp(cmd,"Give")==0) CMD_GIVE(&args); else if (strcmp(cmd,"LoadMap")==0) CMD_LoadMap(&args); else if (strcmp(cmd,"AddNpc")==0) CMD_ADDNPC(&args); else if (strcmp(cmd,"RemoveNpc")==0) CMD_REMOVENPC(&args); else if (strcmp(cmd,"RestoreHP")==0) CMD_RESTOREHP(&args); else if (strcmp(cmd,"RestoreMP")==0) CMD_RESTOREMP(&args); else if (strcmp(cmd,"Scan")==0) CMD_SCAN(&args); else if (strcmp(cmd,"Escape")==0) CMD_ESCAPE(); else if (strcmp(cmd,"Resurect")==0) CMD_RESURECT(&args); else if (strcmp(cmd,"Antidote")==0) CMD_ANTIDOTE(&args); else if (strcmp(cmd,"Elemental")==0) CMD_ELEMENTAL(&args); else if (strcmp(cmd,"GoTo")==0) CMD_GOTO(&args); else if (strcmp(cmd,"Let")==0) CMD_LET(&args); else if (strcmp(cmd,"AddPartyMember")==0) CMD_ADDPMEMB(&args); } } args.clear(); } //--------------------------------------------- void CommandLine(){ //komandine eilute char code[80]; CodeEdit.getInput(globalKEY); if (CodeEdit.entered) { strcpy(code,CodeEdit.text); Interpret(code); code_enter=false; PartyControl=true; code_enter_enabled=false; CodeEdit.reset(); } } //---------------- void RunScript(){ ScriptLineIndex++; if (ScriptLineIndex==Scriptas.code.count()) ExeScript=false; else{ char buf[255]; //sprintf(buf,"%d %s",ScriptLineIndex, Scriptas.code[ScriptLineIndex].code); //WriteLog(buf); Interpret(Scriptas.code[ScriptLineIndex].code); } } //---------------------------------------------------- unsigned char GetDir(unsigned int key){ switch(key) { case SDLK_UP: return 2; //up} case SDLK_DOWN: return 1; //down} case SDLK_LEFT: return 4; //left} case SDLK_RIGHT: return 3; //right} default: return 0; } } //========================VIZUALIZACIJA============================ //dalis kodo pabegi i OnCombat //--------- nuo kur pradet piest parti ar priesai ticai parcio klase void AnimateFighters(unsigned short x,unsigned short y, unsigned char tics){ int fighterx,//xposlinkis fightery,//yposlinkis kadras; int percent=(int)ceil(tics/(CAnimControl.MaxCombatFrame/100.0f)); bool cast; //isrikiuojame kad butu piesiamas toliausiai esantis pirmiausiai Cmb* vf[8]; for (int i=0;iy>vf[i+1]->y){ Cmb* tmp=vf[i]; Cmb* tmp2=vf[i+1]; vf[i+1]=tmp; vf[i]=tmp2; } } } for (int i=0;inr; fighterx=vf[i]->x; //pradines pozicijos fightery=vf[i]->y; kadras=vf[i]->frame; //pajungia kamehameha cast=false; if (vf[i]->tipas==1) { if (PartyActions[kuris].magicefect){ cast=true; if (percent>25) { PartyActions[kuris].magicefect=false; cast=false; } } } else{ if (EnemyActions[kuris].magicefect){ cast=true; if (percent>25) { EnemyActions[kuris].magicefect=false; cast=false; } } } //parenkam spraita Party* partis=0; if (vf[i]->tipas==1) partis=&jparty; else partis=&eparty; if (!partis->m[kuris].escaped) { unsigned char veidas; if (partis->m[kuris].race > 0) veidas=19+partis->m[kuris].race-1; else veidas=19+partis->m[kuris].race-1+partis->m[kuris].sex-1; int klaseskadras=0; if (partis->m[kuris].race==0) klaseskadras=partis->m[kuris].klass*8; picsai.draw(veidas,x+fighterx,y+fightery,klaseskadras+kadras,1.0f,1.5f,1.5f);//paisom veikeja } if ((partis->m[kuris].poisoned)&&(! partis->m[kuris].dead)) picsai.draw(picsai.findpic("mark.tga"), x+fighterx+20,y+fightery+20,0); //paisom klecka //kamehameha if (cast){ int ballx=vf[i]->x; picsai.draw(picsai.findpic("ha.tga"),ballx,y+fightery-60+(tics*2),0); } if (partis->m[kuris].dead==false) { //kiek nuima hp if ((percent>50)&&(percent<70)&&(vf[i]->hp!=partis->m[kuris].hp.def)){ DrawNum(x+fighterx+20,y+fightery-percent+20,partis->m[kuris].hp.def-vf[i]->hp, picsai.findpic("numred.tga"), picsai); } //kiek nuima mp if ((percent<30)&&(vf[i]->mp!=partis->m[kuris].mp.def)){ DrawNum(x+fighterx+20,y+fightery-percent,partis->m[kuris].mp.def-vf[i]->mp, picsai.findpic("numblue.tga"), picsai); } } } } //----------------------------------------- void VisualCombat(unsigned short x,unsigned short y,unsigned char kadrai){ Console.setpos(5,300); //AnimateFighters(x, y+50,kadrai); FightersStatus(450, 5, eparty, visible_enemy, picsai, picsai.findpic("frm.tga"), picsai.findpic("charai.tga")); FightersStatus(5,5,jparty,true, picsai, picsai.findpic("frm.tga"), picsai.findpic("charai.tga")); } //==============VIZUALIZACIJA====================== void NextActiveFighter(){ AF.activeFighter++; if (AF.activeFighter >= Entit.count){ AF.activeFighter = 0; bVisiKovesi = true; } int cnt = 0;; while ((Entit.fighters[AF.activeFighter].hp <= 0) && (AF.activeFighter < Entit.count) && (cnt < Entit.count+1)){ AF.activeFighter++; cnt++; if (AF.activeFighter >= Entit.count){ AF.activeFighter = 0; if (!bVisiKovesi) bVisiKovesi = true; } } } //----------------------------------- //UNUSED void CombatAnim(Action* actions,int koef, int index, int percent){ int priesonr=actions[Entit.fighters[index].nr].op; int priesoEntitIndex=0; if (priesonr>3){ priesonr-=4; priesoEntitIndex=Entit.findFighter(2,priesonr); } else priesoEntitIndex=Entit.findFighter(1,priesonr); int pradposY=(Entit.fighters[index].nr+1)*30; int pradposX=0; if (koef==1) pradposX=160-Entit.fighters[index].nr*20; else pradposX=360+Entit.fighters[index].nr*20; if (actions[Entit.fighters[index].nr].atc){ /* if(percent==1){ char buf[255]; sprintf(buf,"Prieso y,x :%d %d, o nr:%d, index:%d ",Entit.fighters[priesoEntitIndex].y,Entit.fighters[priesoEntitIndex].x, Entit.fighters[priesoEntitIndex].nr,priesoEntitIndex); Console.putText(buf); }*/ if ((percent>15)&&(percent<40)){ if (koef==-1){ //jei puola priesai if (Entit.fighters[priesoEntitIndex].tipas==1){ //if (Entit.fighters[priesoEntitIndex].x+64Entit.fighters[index].x+64) // Entit.fighters[index].x+=koef*4; } } //if (Entit.fighters[priesoEntitIndex].y>Entit.fighters[index].y) // Entit.fighters[index].y+=2; //else //if (Entit.fighters[priesoEntitIndex].y40)&&(percent<55)){ //rodom atakos kadra if (koef==1) Entit.fighters[index].frame=2; else{ if (eparty.m[Entit.fighters[index].nr].race>3) Entit.fighters[index].frame=1; else Entit.fighters[index].frame=3; } } //griztam atgal if ((percent>55)&&(percent<80)){ //if((Entit.fighters[index].x>pradposX+10)&&(Entit.fighters[index].tipas==1)) //Entit.fighters[index].x-=koef*4; //else //if ((Entit.fighters[index].xpradposY){ //Entit.fighters[index].y-=2; } else{ //if (Entit.fighters[index].y80)&&(percent<85)){ if(Entit.fighters[index].x>pradposX){ //Entit.fighters[index].x-=koef*2; } else { //if(Entit.fighters[index].x85) actions[Entit.fighters[index].nr].atc=false; } } //----------------------------------------------- void FighterActionSelection(){ printf("tipas %d; activefighter:%d; count:%d\n", Entit.fighters[AF.activeFighter].tipas, AF.activeFighter, Entit.count); switch (Entit.fighters[AF.activeFighter].tipas) { //hero case 1: if (!jparty.m[AF.partyIndex].dead) { puts("tu varai"); if (! HeroActionSelect) { HeroActionSelect = true; puts("Hero action select = true"); HeroActionDone = false; //try CreateActionMenu(AF.partyIndex, ActionSelect); CreateItemsMeniu(200, 50, daiktasmeniu, jparty.m[AF.partyIndex]); CreateSpellMeniu(spellmeniu, jparty.m[AF.partyIndex]); HA_prieso_nr=255; HA_item=0; } HeroAction(AF.partyIndex, HeroActionDone); if (HeroActionDone){ HeroActionSelect = false; //HeroActionDone = false; puts("stop this nonsence"); poison_works(jparty, AF.partyIndex); } } break; //enemy------------------------- case 2: if (!eparty.m[AF.partyIndex].dead){ EnemyAI(AF.partyIndex, Strategy); puts("pipis"); HeroActionDone = true; } } } //---------------------------------------------------------- void CombatAnimationHandling(){ int percent = CAnimControl.percent(); if ((percent>0) && (percent<10)){ //išbėgimas į prieki ? if(Entit.fighters[AF.activeFighter].tipas == 1) //TODO: pakeisti kad judėtų pagal vektoriu Entit.fighters[AF.activeFighter].x -=0.05f; else Entit.fighters[AF.activeFighter].x +=0.05f; Cam3D.move(0.2f); } /*for (int i=0;i90) && (percent<100)){ ////TODO: pakeisti kad judėtų pagal vektoriu if(Entit.fighters[AF.activeFighter].tipas == 1) Entit.fighters[AF.activeFighter].x += 0.05f; else Entit.fighters[AF.activeFighter].x -= 0.05f; Cam3D.move(-0.2f); } } //-------------------------------------------------------------------------------------- // * NEW * if fight == true void OnCombat(){ if ((!CAnimControl.CombatAnimationRun) && (! gameover) && (!HeroActionSelect)) CAnimControl.CombatAnimationRun = true; if (((victory) || (jparty.present==0)) && (!Console.active)) { End_combat(); victory = false; } if ((!gexit) && (!gameover)){ CombatAnimationHandling(); if ( ((CAnimControl.percent() < 10) && (!HeroActionSelect)) || (HeroActionDone) ){ CAnimControl.CombatFrame++; } } if ((CAnimControl.percent() >= 10) && (!victory) && (!HeroActionDone)){ AF.partyIndex = Entit.fighters[AF.activeFighter].nr; FighterActionSelection(); } if (CAnimControl.CombatFrame > CAnimControl.MaxCombatFrame) { CAnimControl.CombatAnimationRun = false; //visualizacijos kadru pabaiga CAnimControl.CombatFrame = 0; } if ((!CAnimControl.CombatAnimationRun) && (!victory)){ if (bVisiKovesi) { Entit.build(jparty, eparty, EnemyActions, PartyActions); //padaro fighteriu lenetele bVisiKovesi=false; } Entit.colectHpMp(jparty,eparty); HeroActionDone = false; NextActiveFighter(); chek_victory(); } } //-------------------------------------------- //kai uzeinam ant miesto void OnEntry(unsigned short x,unsigned short y){ int i=0; if (ivykiai.count()){ while (((ivykiai.entries[i].x!=x)||(ivykiai.entries[i].y!=y))&& (i < ivykiai.count())) i++; if ((ivykiai.entries[i].x==x) && (ivykiai.entries[i].y==y)) { jparty.steps=0; Interpret(ivykiai.entries[i].code); return; } } if (((x>map.width-2)||(x<1)||(y<1)||(y>map.height-2))&&(ivykiai.isSpecialEvent)) if (strcmp(ivykiai.specialEvent.code,"")!=0) { jparty.steps=0; Interpret(ivykiai.specialEvent.code); } } //---------------------------------------------------- //Ganetinai bugova ir neoptimali procedura sieja // playerio npc ir kameros judejima ir netik void Walking(){ Npc* dudes=npcnation.npcs; bool eina=false; //generuojam parcio dira pagal keyu jparty.mdir[0]=GetDir(globalKEY); int tx=0,ty=0; int first=npcnation.count-jparty.count; translatedir(jparty.mdir[0],tx,ty); int tmppx=(dudes+first)->x+tx; int tmppy=(dudes+first)->y+ty; /*tam kad duris atrakintu kolkas duris gali atrakint tik PIRMAS parcio veikejas, jei nugaises bus ir pize*/ if (PartyControl) { if ((tmppy<(int)map.height)&&(tmppx<(int)map.width)){ /*if ((map.map[tmppy][tmppx].Layer1.sqtype==7)&& (map.map[tmppy][tmppx].Layer1.tilenum==0)){ if (jparty.m[0].inventory.getItemCountByName("key",itemData)) { UnlockDoor(tmppx,tmppy); int keyplace=jparty.m[0].inventory.findItemByName("key",itemData); jparty.m[0].inventory.removeItem(keyplace); atrakino=true; } } */ if (lobiai.count){ int z=0; while(((lobiai.locations[z].x != npcnation.npcs[0].x+npcnation.npcs[0].pdir.x) &&(lobiai.locations[z].y != npcnation.npcs[0].y+npcnation.npcs[0].pdir.y)) &&(zwalk) (dudes+first+i)->inctimer(npcnation,map,lobiai); } if (PartyControl) { if (((dudes+first)->timeris == 0)&&(jparty.mdir[0]!=0)) { (dudes+first)->redir(jparty.mdir[0],npcnation); eina=true; (dudes+first)->stepcount=1; if ((dudes+first)->canGo(map,npcnation,lobiai)) jparty.membersxyPush((dudes+first)->x,(dudes+first)->y); for (int i=1;ix < jparty.membersxy[i].x()) jparty.mdir[i]=3; else if ((dudes+first+i)->x>jparty.membersxy[i].x()) jparty.mdir[i]=4; else if ((dudes+first+i)->yy>jparty.membersxy[i].y()) jparty.mdir[i]=2; else jparty.mdir[i]=0; if ((dudes+first)->timeris==0) { (dudes+first+i)->redir(jparty.mdir[i],npcnation); (dudes+first+i)->stepcount=1; } } if ((dudes+first)->timeris==0) { Cam.x=(dudes+first)->x; Cam.y=(dudes+first)->y; MoveCamera(Cam.x,Cam.y,view); } } } // //? if ((eina)&&(!(dudes+first)->timeris)) { jparty.steps++; if (next_step) next_step=false; jparty.x=(dudes+first)->x; jparty.y=(dudes+first)->y; for (int i=1;istepcount==1){ char muf[50]; sprintf(muf,"Let(\"%s\",\"inactive\")",buf); Interpret(muf); } else{ char muf[50]; sprintf(muf,"Let(\"%s\",\"active\")",buf); Interpret(muf); } if (dude->job<255) { if ((dude->job==4)&&(dude->use_ai==false)) { int i=0; while (((npcnation.npcs[i].x!=dude->x)||(npcnation.npcs[i].job!=255))&&(iy+1)&&(npcnation.npcs[i].y!=dude->y-1)) dude->use_ai=true; } else{ int i=0; while (((npcnation.npcs[i].y!=dude->y)||(npcnation.npcs[i].job!=255))&&(ix+1)&&(npcnation.npcs[i].x!=dude->x-1)) dude->use_ai=true; } else dude->use_ai=true; } } if (dude->walk) dude->inctimer(npcnation,map,lobiai); if ((!dude->timeris)&&(dude->use_ai)) { if (dude->redir(rand()%4+1,npcnation)){ dude->walk=true; dude->stepcount=2; } } } dude++; } } //----------------------------------------- void Talkingas(){ Npc* hero=npcnation.npcs;//[npcnation.count-3]; hero+=npcnation.count-jparty.count; int i=0; unsigned char npcID=0; while ((ix + hero->pdir.x) || (npcnation.npcs[i].y!=hero->y + hero->pdir.y))) i++; if (i0)&&(npcID!=255)) { if ((npcnation.npcs[npcID-1].job!=255)&&(!ExeScript)) { npcnation.npcs[npcID-1].pdir.x = hero->pdir.x * -1; npcnation.npcs[npcID-1].pdir.y = hero->pdir.y * -1; Interpret(npcnation.npcs[npcID-1].speech); } switch(npcnation.npcs[npcID-1].job){ case 1: ENCsmith=true; break; //ginklai case 2: ENCmersh=true; break; //itemsai case 3: ENCinn=true; break; //miegot } } talk=false; } //----------------------------------------------- //Tai kas vyksta kai paspaudi tarpa} void OnActionSel(){ if (!orderselect.selected){ orderselect.getInput(globalKEY); } else { TakeOrders(orderselect.state); //nurodymu vygdymas } if (orderselect.canceled) { action_sel=false; orderselect.reset(); } } //----------------------------------------------- //Tai kas vyksta kai zaidi; labai ilga procedura} void Game(){ if (globalKEY == 96){ if (Console.height() > 72) Console.setHeight(72); else Console.setHeight(160); } if ((!gexit)&&(! action_sel) &&(! ENCinn)&&(! ENCsmith) &&(! ENCmersh)) { if (globalKEY==27) { gexit=true; quitmensel.reset(); //resetinam quit Y/N } } //''''''''''''''''''''''''''''''''''' if (Console.active){ //raso konsoleje po viena simboli static int t_tmp=0; t_tmp++; if (t_tmp==5){ t_tmp=0; Console.type(oldKEY); } Interpret("Let(\"console\",\"active\")"); } else Interpret("Let(\"console\",\"inactive\")"); //''''''''''''''''''''''''''''''''''' if (!Fight) { //``````````````````` if (conversation.active) { conversation.type(oldKEY); Interpret("Let(\"conversation\",\"active\")"); } else Interpret("Let(\"conversation\",\"inactive\")"); if (code_enter_enabled) {code_enter=true; PartyControl=false;} if (globalKEY==SDLK_TAB) code_enter_enabled=true; if ((!action_sel)&&(!gexit)&&(!weldone) &&(!ENCinn)&&(!ENCsmith)&&(!ENCmersh)){ //jei ne action_sel pradzia if ((globalKEY==32)&&(! code_enter)&&(PartyControl)) action_sel=true; if ((oldKEY==13)&&(globalKEY!=oldKEY)&&(!code_enter)&&(PartyControl) &&(! conversation.active)) talk=true; if ((MapPushdirx!=0)||(MapPushdiry!=0)){ GlobalMapPushtimer++; Interpret("Let(\"camera\",\"moving\")"); if (GlobalMapPushtimer>32){ GlobalMapPushtimer=0; Interpret("Let(\"camera\",\"stop\")"); Cam.x=Cam.x+MapPushdirx; Cam.y=Cam.y+MapPushdiry; MoveCamera(Cam.x,Cam.y,view); MapPushsteps--; if (MapPushsteps<=0){ MapPushdirx=0; MapPushdiry=0; } } } if (npcnation.count) Walking(); //reikia pataisyt } //jei ne action_sel pabaiga if (atrakino) { char buf[20]; sprintf(buf,"%s unlocks door.",jparty.m[0].name); Console.putText(buf); atrakino=false; } if (!no_enemy) LookForEnemy(); } //ifn (!Fight) //''''''''''''''''''''''''''''''''' if (first_time) { Console.readFile("data/hello.txt"); //vienkartinis pasisveikinimas first_time=false; } //'''''''''''''''''''''''''''''''''' if (action_sel) OnActionSel() ; //jei tarpas paspaustas if ((talk)&&(npcnation.count)) Talkingas(); //''''''''' '''''''''''''''''''''''''' if (ENCsmith) SmithShop(); if (ENCmersh) Merchantshop(); if (ENCinn) TheInn(); NpcAI(); //''''''''''''''''' if (Fight) OnCombat(); if (code_enter) CommandLine(); if (ExeScript) RunScript(); char* reiksme=Kintamieji.getValue("EndGame"); if (reiksme){ if (strcmp(reiksme,"true")==0){ weldone=true; } } if (gexit) ExitYesNo(); //ismeta dialoga xt Y/N ? } //Game pabaiga //------------------------------------------------ void ResetGlobals(){ //resetina dauguma globaliu boolean tipo kintamuju} bVisiKovesi=true; gexit=false; //iseiti i pagrindini meniu ne} weldone=false; gameover=false;//kolkas neprakisom} atacked=false; atrakino=false; Fight = false; AF.activeFighter = 0; code_enter=false; //nevedam secret codo} visible_enemy=false; code_enter_enabled=false; no_enemy=false; encounter_step=rand()%10+4; hMaker.htc=0; hMaker.reset(); g_member=255; g_act=255; g_oponent=255; gs_daiktas=0; gs_face=255; HeroActionSelect=false; HeroActionDone=false; ExeScript=false; PartyControl=true; action_sel=false; innparty.count=0; Kintamieji.destroy(); } //------------------------------------------- //Uzdeda bg paveiksliuka,title ir t.t.} void DrawIntroScreen(){ picsai.draw(picsai.findpic("bg.tga"), 0, 0, 0, false, 1.25f, 1.875f); picsai.draw(picsai.findpic("title.tga"), 200,10,0); char buf[30]; sprintf(buf,"Godrpg engine ver. %s", version); int font = picsai.findpic("charai.tga"); WriteText(190,430,picsai, font,buf); WriteText(220,450,picsai, font,"made by jrs0ul 2007"); } //------------------------------------------- //Pacio pagrindinio meniu valdymas void TitleMeniu(){ if (Mainmenu.selected ){ switch(Mainmenu.state){ case 0:{ CreatParty=true; } break; case 1:{ onward(); //pakrauna heroju faila jparty.alive=jparty.count; } break; case 2:shut_down=true; } globalKEY=0; //isvalom key Mainmenu.reset();//resetinam mainmenu Mainmen=false;//isjungiam mainmeniu } else Mainmenu.getInput(globalKEY); } //=============================================================== //Masivi heroju kurimo proceduru grupe void SelectRace (unsigned char hero, unsigned char key){ racesel.getInput(globalKEY); if (racesel.selected) { jparty.m[hero].race=racesel.state; sprintf(CreateHeroMeniu.selection.opt[0],"Race: %s",rases.rases[racesel.state].name); if (!hMaker.r) hMaker.r=true; if (rases.rases[jparty.m[hero].race].maxsex==1) { jparty.m[hero].sex=0; if (!hMaker.s) hMaker.s=true; sprintf(CreateHeroMeniu.selection.opt[1],"Sex: %s", ML.data[8].opt[0]); } racesel.reset(); CreateHeroMeniu.reset(); } } //------------------------- void SelectSex (unsigned char hero, unsigned short key){ if (rases.rases[jparty.m[hero].race].maxsex>1) { sexsel.getInput(globalKEY); if (sexsel.selected) { jparty.m[hero].sex=sexsel.state; sprintf(CreateHeroMeniu.selection.opt[1],"Sex: %s", ML.data[8].opt[sexsel.state]); if (!hMaker.s) hMaker.s=true; sexsel.reset(); CreateHeroMeniu.reset(); } } else { jparty.m[hero].sex=0; sprintf(CreateHeroMeniu.selection.opt[1],"Sex: %s", ML.data[8].opt[0]); if (!hMaker.s) hMaker.s=true; CreateHeroMeniu.reset(); } } //------------------------- void SelectClass (unsigned char hero, unsigned char key){ classsel.getInput(globalKEY); if (classsel.selected) { jparty.m[hero].klass=classsel.state; sprintf(CreateHeroMeniu.selection.opt[2],"Class: %s",klases.jobs[classsel.state].name); if (!hMaker.c) hMaker.c=true; classsel.reset(); CreateHeroMeniu.reset(); } } //------------------------- void WriteName (unsigned char hero, unsigned char key){ NameEnter.getInput(key); if (NameEnter.entered) { strcpy(jparty.m[hero].name,NameEnter.text); sprintf(CreateHeroMeniu.selection.opt[3],"Name: %s",NameEnter.text); if (!hMaker.done) hMaker.done=true; NameEnter.reset(); CreateHeroMeniu.reset(); } } //------------------------- void RollDice (unsigned char hero){ jparty.m[hero].espeed=rases.rases[jparty.m[hero].race].espeed; //nustato evoliucijos greiti jparty.m[hero].rollDice(rases,klases); //generuojam statusa if (!hMaker.statsok) hMaker.statsok=true; CreateHeroMeniu.reset(); Smenu fm; char picname[50]; if (rases.rases[jparty.m[hMaker.htc].race].maxsex>1){ sprintf(picname,"f%d%s.tga",jparty.m[hMaker.htc].sex,rases.rases[jparty.m[hMaker.htc].race].name); } else sprintf(picname,"f%s.tga",rases.rases[jparty.m[hMaker.htc].race].name); //WriteLog(picname); fm.count = picsai.getInfo(picsai.findpic(picname))->vframes*picsai.getInfo(picsai.findpic(picname))->hframes; /*char buf[50]; sprintf(buf,"%d",fm.count); WriteLog(buf);*/ for (int i=0;imemberscount-1) { char buf[50]; for (int i=0;i1) sprintf(buf,"Let(\"hero%dface\",\"f%d%s.tga\")",i,jparty.m[i].sex,rases.rases[jparty.m[i].race].name); else sprintf(buf,"Let(\"hero%dface\",\"f%s.tga\")",i,rases.rases[jparty.m[i].race].name); Interpret(buf); sprintf(buf,"Let(\"hero%dfaceID\",\"%d\")",i,jparty.m[i].faceID); Interpret(buf); } CreatParty=false; Interpret("Exec(\"scripts/begining.gsc\")"); jparty.udoors.doorcount=0; jparty.count=memberscount; remove("data/heroes.sav"); jparty.alive=jparty.count; } } } //--------------- void GameOver(){ DrawBlock(250,160,150,80,COLOR(0,0,1.0f)); WriteText(285,175, picsai, picsai.findpic("charai.tga"),"GAME OVER"); WriteText(280,188, picsai, picsai.findpic("charai.tga"),"press any key..."); coolframe(250,160,150,80, picsai, picsai.findpic("frm.tga")); } //-------------------------------------------------- void LoadGraphics(){ picsai.loadFile(picc); picc++; if (picc==SYSTEM_imagefilescount) { picc=0; SYSTEM_filesloaded=true; fader=0.0f; WriteLog("Graphics loaded!"); } } //----------------------------------- void OnBegin(){ Smenu tmpmen; srand((int)time(0)); SYSTEM_filesloaded=false;//failai nepakrauti WriteLog("loading picture list"); if (!picsai.initContainer("pics/piclist.txt")) QuitApp(); picc=0; SYSTEM_imagefilescount=picsai.count(); char buf[50]; sprintf(buf, "Pictures to load: %d", SYSTEM_imagefilescount); WriteLog(buf); WriteLog("Loading strategy"); Strategy.loadStrategy("ai/default.txt"); WriteLog("Loading objects"); LoadObjects("data/objects.dat"); WriteLog("Loading menus"); if (!ML.loadMenus("data/menus.dat")) WriteLog("can't find menu file"); else WriteLog("done!"); ResetGlobals();//resetinam globalius kintamuosius} strcpy(currentmap,"map"); Mainmen = true;//ijunge programa matysime pagrindini meniu CreatParty = false;//new game neaktyvus partyfaces.init(0,380,true,jparty); //snukiu selectoriaus init for (int a=0;a<4;a++) //sukisam rasiu pavadinimus i racemen hunter cia nebus} strcpy(hrace.opt[a],rases.rases[a].name); hrace.count=4; CreateHeroMeniu.init(3,3,"Creating first hero :", ML.data[7], 0); CreateHeroMeniu.selection.count=3; racesel.init (10,10, "choose hero's race :", hrace,0); sexsel.init (10,10, "choose hero's sex :", ML.data[8],0); for (int a=0;a<3;a++) strcpy(tmpmen.opt[a],klases.jobs[a].name); tmpmen.count=3; classsel.init(10,10,"choose hero's class :",tmpmen,0); NameEnter.init(10,10,"Enter hero's name:",7); Console.init(100,0,36,19*18); conversation.init(90,100,60,19*18); SmithMeniu.init(380,0,"Youre at blacksmith:", ML.data[6],0); merchantmeniu.init(380,0,"Youre in item shop:", ML.data[6],0); innmeniu.init(380,0,"You're in the inn:", ML.data[10],0); InitBuyMenus(wepm,stfm);//buy //meniu kai space paspaudi orderselect.init(400,0,"Choose:", ML.data[0],0); optmeniu.init(380,10,"Choose option:", ML.data[1],0); invsel.init(0,80,"Choose:", ML.data[2],0); invsel.activate(); beqp.init(0,121,"Equip/Unequip:", ML.data[3],0); quitmensel.init(10,10,"Reset game ?", ML.data[9],0); //komanu ivedimo laukelis CodeEdit.init(10,10,"codeline:",40); itemcountedit.init(100,100,"How much ?:",4); Mainmenu.init(270,200,"", ML.data[5],1); } //------------------------------------------------ void OnTimer(){ if (!SYSTEM_filesloaded){ LoadGraphics(); } else { if (fader<1.0f){ fader+=0.05f; } if (Mainmen){ TitleMeniu(); //nupaiso title screena ir mainmenu } else { if (CreatParty){ //jei pasirinkom new game CreateParty(); //kuriame herojus } //''''' else { if (!jparty.alive) gameover=true; Game(); //leidziam zaidima if (gameover){ if (oldKEY) { ResetGlobals(); Mainmen=true; } } if(((quitmensel.selected)&&(quitmensel.state==0)) ||((weldone))){ Mainmen=true; ResetGlobals(); //resetinam globalius kintamuosius quitmensel.reset(); //resetinam quit Y/N } } //'''' } } oldKEY=globalKEY; globalKEY=0;//resetinam global keyu } //---------------------------------- int FPS (void){ static int time = 0, FPS = 0, frames = 0, frames0 = 0; if ((int)SDL_GetTicks() >= time) { FPS = frames-frames0; time = SDL_GetTicks()+1000; frames0 = frames; } frames = frames+1; return FPS; } //------------------------------------ void CheckKeys(){ Uint8 * keyz; OldJoyX = JoyX; OldJoyY = JoyY; keyz = SDL_GetKeyState ( NULL ); if (SDL_NumJoysticks()>0) { SDL_JoystickUpdate (); JoyX = SDL_JoystickGetAxis(Joy, 0); JoyY = SDL_JoystickGetAxis(Joy, 1); } memset(keys,0,7); //------------------------------ if (keyz[SDLK_w]) Cam3D.move(0.01); if (keyz[SDLK_s]) Cam3D.move(-0.01); if (keyz[SDLK_a]) Cam3D.yaw(-0.0005f); if (keyz[SDLK_d]) Cam3D.yaw(0.0005f); if (( keyz[SDLK_UP] == SDL_PRESSED )||(JoyY<-1)) keys[0] = 1; if (( keyz[SDLK_DOWN] == SDL_PRESSED )||(JoyY>1)) keys[1] = 1; if (( keyz[SDLK_RIGHT] == SDL_PRESSED )||(JoyX>1)) keys[3] = 1; if (( keyz[SDLK_LEFT] == SDL_PRESSED )||(JoyX<-1)) keys[2] = 1; if (( keyz[SDLK_RETURN] == SDL_PRESSED )||(SDL_JoystickGetButton (Joy, 0))) keys[4] = 1; if (( keyz[SDLK_ESCAPE] == SDL_PRESSED )||(SDL_JoystickGetButton (Joy, 1))) keys[5] = 1; if (( keyz[SDLK_SPACE] == SDL_PRESSED )||(SDL_JoystickGetButton (Joy, 2))) keys[6] = 1; } //------------------- void DrawSomeText(int fontas){ //biski texto char buf[80]; //sprintf(buf,"FVM: %d KB",D3D.lpD3DDevice->GetAvailableTextureMem()/1024); //WriteText(480,410, picsai, fontas,buf,0.5f); //sprintf(buf,"FSM: %d KB",AvailSysMem()/1024); //WriteText(480,430,D3D.spraitas,fontas,buf,0.5f); sprintf(buf,"FPS : %d",FPS()); WriteText(530,450, picsai, fontas, buf, 0.5f); } //------------------------------- void DrawArena(){ glLoadIdentity(); gluLookAt( Cam3D.pos().x(),Cam3D.pos().y(),Cam3D.pos().z(), Cam3D.pos().x() + Cam3D.dir().x(), Cam3D.pos().y() + Cam3D.dir().y(), Cam3D.pos().z() + Cam3D.dir().z(), Cam3D.up().x(), Cam3D.up().y(), Cam3D.up().z()); glEnable(GL_LIGHTING); glShadeModel(GL_SMOOTH); GLfloat lightposition[] = { 0.5, -1.0, 0.0, 0.0 }; //jei paskutinis elementas 0 reiškia directional, jei 1 - point GLfloat light_ambient[] = { 0.01, 0.01, 0.01, 0.01 }; GLfloat mat_difuse[] = { 1.0, 1.0, 1.0, 1.0 }; GLfloat mat_red[] = { 1.0, 0.0, 0.0, 1.0 }; GLfloat mat_green[] = { 0.0, 1.0, 0.0, 1.0 }; glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); glLightfv(GL_LIGHT0, GL_POSITION, lightposition); glEnable(GL_LIGHT0); glPushMatrix(); //glTranslatef(0,0,0); //glScalef(0.0f,0.02f,0.02f); glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_difuse); glMaterialfv(GL_FRONT, GL_AMBIENT, mat_difuse); glPushMatrix(); glTranslatef(0, 0, 0); glRotatef(180,1,0,0); glScalef(2.0f,2.0f,2.0f); glBindTexture(GL_TEXTURE_2D, picsai.getname(4)); glDisable(GL_DEPTH_TEST); glDisable(GL_LIGHTING); skybox.drawsubset(0); glEnable(GL_LIGHTING); glEnable(GL_DEPTH_TEST); glDisable(GL_TEXTURE_2D); glPopMatrix(); glPushMatrix(); glTranslatef(0, 0, 0); arena.drawsubset(0); for (int i = 0; i < Entit.count; i++){ glPopMatrix(); glPushMatrix(); if (Entit.fighters[i].tipas == 2){ //printf("%f %f\n", Entit.fighters[i].x/99.0f, Entit.fighters[i].y/10.0f); glTranslatef(Entit.fighters[i].x, 1.8, Entit.fighters[i].y); //glTranslatef(Entit.fighters[i].x/99.0f, 1.5, Entit.fighters[i].y/10.0f); glRotatef(90.0f, 0.0f, 1.0f, 0.0f); } else{ glTranslatef(Entit.fighters[i].x, 1.8, Entit.fighters[i].y); //printf("%f %f\n", Entit.fighters[i].x/99.0f, Entit.fighters[i].y/10.0f); //glTranslatef(Entit.fighters[i].x/99.0f, 1.5, Entit.fighters[i].y/10.0f); glRotatef(270.0f, 0.0f, 1.0f, 0.0f); } glScalef(0.5f, 0.5f, 0.5f); if (Entit.fighters[i].tipas == 1){ if (jparty.m[Entit.fighters[i].nr].poisoned) glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_green); else glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_difuse); } else{ if (eparty.m[Entit.fighters[i].nr].poisoned) glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_green); else glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_difuse); } if (Entit.fighters[i].hp <= 0) fighter.drawsubset(0,1); else fighter.drawsubset(0,0); } glPopMatrix(); glPushMatrix(); if ((!Combatselect.selected)&&(ActionSelect.selected)){ glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_red); Combatselect.draw(rodykle, picsai, picsai.findpic("handy.tga")); //rankele } glEnable(GL_TEXTURE_2D); glPopMatrix(); } //------------------------------------------------------------------------------------------ // Renders stuff in the screen void RenderScreen(){ glClearColor (0, 0, 0, 1.0); glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT ); //------------------------ // 3D mode //--------------------- if (Fight) DrawArena(); //--------------GO TO 2D mode glMatrixMode (GL_PROJECTION); glPushMatrix(); glDisable(GL_DEPTH_TEST); glDisable(GL_LIGHTING); glLoadIdentity (); gluOrtho2D (0.0, (GLdouble) Sys.width, (GLdouble) Sys.height, 0.0); //glRectf(10,60,100,200); glMatrixMode( GL_MODELVIEW ); //----------------------------------- // static int frame=0; int fontas = picsai.findpic("charai.tga"); int rodykle = picsai.findpic("rod.tga"); int remelis = picsai.findpic("frm.tga"); //---------------------------------------- if (SYSTEM_filesloaded){ //kai nesikaunam, nerodo pagrindinio meniu ir nekuriam heroju tai piesia mapa if ((!Fight) && (!CreatParty) && (!Mainmen)) { unsigned scrollx=0; unsigned scrolly=0; //kai comanda pastumia if ((MapPushdiry!=0) || (MapPushdirx!=0)){ scrollx=MapPushdirx * GlobalMapPushtimer; scrolly=MapPushdiry * GlobalMapPushtimer; } else{ if (npcnation.count){ //kai herojus kamera pastumia scrollx=npcnation.npcs[npcnation.count-jparty.count].pdir.x * npcnation.npcs[npcnation.count-jparty.count].timeris; scrolly=npcnation.npcs[npcnation.count-jparty.count].pdir.y * npcnation.npcs[npcnation.count-jparty.count].timeris; } } //puts("Draw map"); DrawMap(mapposx, mapposy, 32, scrollx, scrolly); //puts("Drawn"); } //jei pagrindinis meniu ar kuriam herojus intro bg piesiam if ((Mainmen) || (CreatParty)) DrawIntroScreen(); //piesia pagrindini meniu if ((Mainmen) && (!Mainmenu.selected)) Mainmenu.draw(picsai, remelis, rodykle,fontas); //kai kuriame herojus if (CreatParty){ if (hMaker.statsok) CreatureInfo(220,200,jparty.m[hMaker.htc],hrace,itemData, ML.data[8],Arminfo, remelis,fontas, picsai); //ar pasirinkta kas nors,jei ne piesiam meniu if (! CreateHeroMeniu.selected){ CreateHeroMeniu.draw( picsai,remelis,rodykle,fontas); } else{ //jei pasirinkta switch(CreateHeroMeniu.state){ case 0: racesel.draw(picsai, remelis,rodykle,fontas); break; case 1: sexsel.draw(picsai, remelis,rodykle,fontas); break; case 2: classsel.draw(picsai, remelis,rodykle,fontas); break; case 3: NameEnter.draw(picsai,fontas,remelis); break; case 5:{ char buf[50]; if (rases.rases[jparty.m[hMaker.htc].race].maxsex>1){ sprintf(buf,"f%d%s.tga",jparty.m[hMaker.htc].sex,rases.rases[jparty.m[hMaker.htc].race].name); } else sprintf(buf,"f%s.tga",rases.rases[jparty.m[hMaker.htc].race].name); SelectNewFace.draw(picsai, remelis,rodykle,fontas,picsai.findpic(buf)); } } } }//CreateParty //----------------------------- if (!Fight){ if (Console.active){ Console.draw(picsai, remelis,fontas); } if (InnPartyMeniu.active()) InnPartyMeniu.draw(picsai, remelis,rodykle,fontas); //--- //jei paspaustas tarpas, rodo heroju snukius if (action_sel){ PartyStatus(0,380,jparty,false,false); if (!orderselect.selected) orderselect.draw(picsai, remelis,rodykle,fontas); else { //rodoma infa apie heroju if (orderselect.state == 3) CreatureInfo(10,80,jparty.m[partyfaces.face],hrace,itemData, ML.data[8],Arminfo, remelis,fontas, picsai); if (orderselect.state == 4)//options meniu optmeniu.draw(picsai, remelis,rodykle,fontas); //piešiamas spell meniu, jei aktyvuotas. if ((spellmeniu.active())&&(!spellmeniu.selected)){ spellmeniu.draw(picsai, remelis,rodykle,fontas); } if ((!daiktasmeniu.selected) && (!daiktasmeniu.canceled) && (g_member!=255)) { daiktasmeniu.draw(picsai, remelis,rodykle,fontas,picsai.findpic("icons.tga")); } if ((daiktasmeniu.selected) && (!invsel.selected) && (g_act==255)) invsel.draw(picsai, remelis,rodykle,fontas); if (beqp.active()) beqp.draw(picsai, remelis,rodykle,fontas); if ((!itemcountedit.entered) && (g_oponent != 255)) itemcountedit.draw(picsai,fontas,remelis); } } //--- //piesia komandine eilute if (code_enter) CodeEdit.draw(picsai,fontas,remelis); //rodome conversation langa jei kas nors ka sako if (conversation.active) { conversation.draw(picsai,remelis,fontas); talker.draw(picsai, picsai.findpic("status.tga"), 14, fontas); } //------------------- //kai uzkalbini innkeeperi piesia meniu if ((ENCmersh)||(ENCinn)||(ENCsmith)){ PartyStatus(0,380,jparty,false,false); if (gitemmeniu.active()){ gitemmeniu.draw(picsai, remelis, rodykle, picsai.findpic("charai.tga")); } if (innmeniu.active()) innmeniu.draw(picsai, remelis, rodykle, fontas); if (ENCsmith){ if (!SmithMeniu.selected) SmithMeniu.draw(picsai, remelis, rodykle, fontas); if (wepm.active()) wepm.draw(picsai, remelis, 12, picsai.findpic("charai.tga")); } if (ENCmersh){ if (!merchantmeniu.selected) merchantmeniu.draw(picsai, remelis, rodykle, fontas); if (stfm.active()) stfm.draw(picsai, remelis, rodykle, fontas); } } //((ENCmersh)||(ENCinn)||(ENCsmith)) -------------------- if (partyfaces.active()){ partyfaces.draw(picsai, picsai.findpic("faceselector.tga")); } } //(!fight) else { // jei fight=true; //TODO: Perkelti šita į atskira funkciją VisualCombat(10, 5, CAnimControl.CombatFrame); //visual langas //console Console.draw(picsai, remelis,fontas); if (ActionSelect.active()) ActionSelect.draw(picsai, remelis,rodykle,fontas); if (spellmeniu.active()) spellmeniu.draw(picsai, remelis,rodykle,fontas); if (daiktasmeniu.active()) daiktasmeniu.draw(picsai, remelis, rodykle,fontas,picsai.findpic("icons.tga")); } //----------------- //jei paspaustas esc if (gexit){ quitmensel.draw(picsai, remelis, rodykle, fontas); } if (gameover) GameOver(); DrawSomeText(fontas); } else{ // jei failai nepakrauti //TODO: Draw some "Loading" stuff } //------------------------------back to 3d mode glEnable(GL_DEPTH_TEST); glMatrixMode (GL_PROJECTION); glPopMatrix(); glMatrixMode( GL_MODELVIEW ); //------------------------------- glFlush(); //```````````` SDL_GL_SwapBuffers( ); static unsigned long tick = SDL_GetTicks(); //.......................... if (SDL_GetTicks()>tick){ OnTimer(); //CheckKeys(); tick = SDL_GetTicks()+10; } //if (fader<1.0f) //Fade(fader,fader,fader,sys.width,sys.height,D3D.spraitas); if (keys[0]) globalKEY=SDLK_UP; if (keys[1]) globalKEY=SDLK_DOWN; if (keys[2]) globalKEY=SDLK_LEFT; if (keys[3]) globalKEY=SDLK_RIGHT; if (keys[4]) globalKEY=SDLK_RETURN; if (keys[5]) globalKEY=SDLK_ESCAPE; if (keys[6]) globalKEY=SDLK_SPACE; CheckKeys(); if (shut_down) QuitApp(); } //----------------------------------------- void QuitOpenAL(){ SS.freeData(); SS.exit(); } //----------------------------------- void Quit(){ QuitOpenAL(); Stream.release(); picsai.destroy(); Strategy.destroy(); lobiai.destroy(); Scriptas.clear(); Kintamieji.destroy(); map.destroy(); ivykiai.destroy(); //ar grazu taip ? MonsterGroups.destroy(); npcnation.destroy(); itemData.destroy(); Burtai.destroy(); for (int i=0;i<4;i++){ jparty.m[i].inventory.clear(); eparty.m[i].inventory.clear(); innparty.m[i].inventory.clear(); } ML.destroy(); arena.destroy(); fighter.destroy(); rodykle.destroy(); skybox.destroy(); } //--------------------------------- static void process_events( void ){ SDL_Event event; while( SDL_PollEvent( &event ) ) { switch( event.type ) { case SDL_KEYDOWN: globalKEY = (char)event.key.keysym.unicode; switch( event.key.keysym.sym ) { case SDLK_ESCAPE:{ } break; case SDLK_p: Sys.gamePaused =! Sys.gamePaused; if (Sys.gamePaused){ SDL_ShowCursor(1); SDL_WM_GrabInput(SDL_GRAB_OFF); } else{ SDL_ShowCursor(0); SDL_WM_GrabInput(SDL_GRAB_ON); } break; default:{} } break; case SDL_QUIT:{ QuitApp(); } } } } //----------------------------------------- static void SetupOpengl( int width, int height ){ const GLubyte* vendor=glGetString(GL_VENDOR); const GLubyte* renderer=glGetString(GL_RENDERER); const GLubyte* version=glGetString(GL_VERSION); const GLubyte* ext=glGetString(GL_EXTENSIONS); WriteLog((const char*)vendor); WriteLog((const char*)renderer); WriteLog((const char*)version); WriteLog((const char*)ext); /*glEnable(GL_TEXTURE_2D); glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ); glFrontFace(GL_CW); glEnable (GL_CULL_FACE); glShadeModel(GL_SMOOTH); glEnable(GL_RESCALE_NORMAL); glViewport (0, 0, (GLsizei) sys.width, (GLsizei) sys.height); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); // glClearDepth(1.0f); // glDepthFunc(GL_LEQUAL); glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); glMatrixMode( GL_PROJECTION ); GLfloat aspect = (GLfloat) sys.width / sys.height; gluPerspective( 60.0, aspect, 1.0, 500.0 ); //glMatrixMode( GL_MODELVIEW ); //glPopMatrix(); //--------------- //Set2D(); glMatrixMode( GL_MODELVIEW );*/ glClearDepth( 1.0 ); glViewport (0, 0, (GLsizei) Sys.width, (GLsizei) Sys.height); //glCullFace (GL_FRONT); glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ); glFrontFace(GL_CW); glEnable (GL_CULL_FACE); //glCullFace(GL_FRONT); //glCullFace(GL_BACK); glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_TEXTURE_2D); //glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glMatrixMode( GL_PROJECTION ); GLfloat aspect = (GLfloat) Sys.width / Sys.height; gluPerspective( 60.0, aspect, 1.0, 500.0 ); glMatrixMode( GL_MODELVIEW ); glEnable(GL_RESCALE_NORMAL); Cam3D.setpos(Vector3D(0.0f, 6.5f, -11.0f)); Cam3D.setdir(Vector3D(0.0f, 0.0f, 1.0f)); Cam3D.setright(Vector3D(1.0f, 0.0f, 0.0f)); Cam3D.setup(Vector3D(0.0f, 1.0f, 0.0f)); Cam3D.pitch(-0.500f); //setpos(Vector3D(200.0f, 80.0f, 200.0f)); arena.load("models/arena_town.rmd"); fighter.load("models/lildude.rmd"); rodykle.load("models/rodykle.rmd"); skybox.load("models/skybox.rmd"); // Cam.setpos(Vector3D(200.0f, 80.0f, 200.0f)); } //-------------------------------- void InitOpenAL(){ bool res = false; if (strlen(Sys.customSoundDevice)) res = SS.init(Sys.customSoundDevice); else res = SS.init(NULL); if (res){ Vector3D p(0,0,0); SS.setupListener(p,p); SS.loadFiles("audio/list.txt"); } else Sys.useSound = false; } //============================================= int main( int argc, char* argv[] ){ srand(time(0)); FILE* log; log = fopen("gamelog.txt","wt+"); fclose(log); WriteLog("Reading INI file"); //TODO: and ? where's ini file ? //ReadIniFile(); WriteLog("done!"); const SDL_VideoInfo* info = NULL; int bpp = 0; // Flags we will pass into SDL_SetVideoMode. int flags = 0; // First, initialize SDL's video subsystem. WriteLog("Trying SDL_INIT..."); if( SDL_Init( SDL_INIT_VIDEO ) < 0 ) { WriteLog("Video initialization failed!"); QuitApp(); } WriteLog("SDL_INIT succsess!"); // Let's get some video information. info = SDL_GetVideoInfo( ); if( !info ) { // This should probably never happen. WriteLog("Video query failed !"); QuitApp(); } bpp = info->vfmt->BitsPerPixel; SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); if (!Sys.isWindowed) flags = SDL_OPENGL | SDL_FULLSCREEN; else flags = SDL_OPENGL; if( SDL_SetVideoMode( Sys.width, Sys.height, bpp, flags ) == 0 ) { WriteLog("Video mode set failed!"); QuitApp(); } if ( Sys.useSound ){ WriteLog("Initializing OpenAL..."); InitOpenAL(); WriteLog("done!"); } WriteLog("Init joystick"); SDL_InitSubSystem(SDL_INIT_JOYSTICK); if(SDL_NumJoysticks()>0){ Joy = SDL_JoystickOpen(0); } SDL_EnableUNICODE(SDL_ENABLE); SDL_ShowCursor(0); //SDL_WM_GrabInput(SDL_GRAB_ON); SetupOpengl(Sys.width, Sys.height ); if ( Sys.useSound ){ //Stream.open("music/music.ogg"); //Stream.playback(); } //TODO: lango antraste //char title[255]; //sprintf(title,"Godrpg ver.%s",version); WriteLog("Let's load some stuff"); OnBegin(); WriteLog("Entering game loop"); //TODO:muzono playbacko updeitas while(!Sys.quitApp) { RenderScreen(); process_events(); } Quit(); #ifdef WIN32 #ifdef _DEBUG _CrtDumpMemoryLeaks(); #endif #endif return 0; }