From 7cb4f99ec4237808ebf0a0c2d67ca08c8df007f5 Mon Sep 17 00:00:00 2001 From: Mark Vejvoda Date: Fri, 12 Mar 2010 05:11:28 +0000 Subject: [PATCH] Code Restructuring to make mega-glest more standard --- mk/linux/data | 1 + mk/linux/glest.ini | 20 +- mk/linux/glest_game | 1 + mk/linux/glest_map_editor | 1 + mk/linux/maps | 1 + mk/linux/scenarios | 1 + mk/linux/screenshots | 1 + mk/linux/servers.ini | 3 + mk/linux/shared_lib | 1 + mk/linux/techs | 1 + mk/linux/tilesets | 1 + mk/linux/tutorials | 1 + mk/windoze/Glest.sln | 0 mk/windoze/Glest.suo | Bin 58368 -> 58368 bytes mk/windoze/g3d_viewer.vcproj | 0 mk/windoze/glest.ico | Bin mk/windoze/glest.rc | 0 mk/windoze/glest_editor.vcproj | 0 mk/windoze/glest_game.vcproj | 0 mk/windoze/shared_lib.vcproj | 0 source/glest_game/graphics/renderer.cpp | 24 ++ source/glest_game/graphics/renderer.h | 30 +-- source/glest_game/gui/gui.cpp | 166 ++++++++++---- source/glest_game/gui/gui.h | 23 +- .../glest_game/network/client_interface.cpp | 0 source/glest_game/type_instances/unit.cpp | 207 +++++++++++++----- source/glest_game/type_instances/unit.h | 41 ++-- source/glest_game/types/command_type.cpp | 106 ++++++--- source/glest_game/types/command_type.h | 58 +++-- source/glest_game/types/skill_type.cpp | 0 source/glest_game/types/skill_type.h | 0 source/glest_game/types/unit_type.cpp | 74 ++++--- source/glest_game/types/unit_type.h | 4 + source/glest_game/world/map.cpp | 90 ++++---- source/glest_game/world/map.h | 0 source/glest_game/world/unit_updater.cpp | 195 ++++++++++------- source/glest_game/world/world.cpp | 125 ++++++----- source/glest_game/world/world.h | 19 +- source/glest_map_editor/main.cpp | 0 .../include/platform/win32/platform_util.h | 0 .../sources/graphics/gl/shader_gl.cpp | 4 +- 41 files changed, 768 insertions(+), 431 deletions(-) create mode 120000 mk/linux/data create mode 120000 mk/linux/glest_game create mode 120000 mk/linux/glest_map_editor create mode 120000 mk/linux/maps create mode 120000 mk/linux/scenarios create mode 120000 mk/linux/screenshots create mode 100644 mk/linux/servers.ini create mode 120000 mk/linux/shared_lib create mode 120000 mk/linux/techs create mode 120000 mk/linux/tilesets create mode 120000 mk/linux/tutorials mode change 100644 => 100755 mk/windoze/Glest.sln mode change 100644 => 100755 mk/windoze/Glest.suo mode change 100644 => 100755 mk/windoze/g3d_viewer.vcproj mode change 100644 => 100755 mk/windoze/glest.ico mode change 100644 => 100755 mk/windoze/glest.rc mode change 100644 => 100755 mk/windoze/glest_editor.vcproj mode change 100644 => 100755 mk/windoze/glest_game.vcproj mode change 100644 => 100755 mk/windoze/shared_lib.vcproj mode change 100644 => 100755 source/glest_game/network/client_interface.cpp mode change 100644 => 100755 source/glest_game/types/skill_type.cpp mode change 100644 => 100755 source/glest_game/types/skill_type.h mode change 100644 => 100755 source/glest_game/world/map.h mode change 100644 => 100755 source/glest_map_editor/main.cpp mode change 100644 => 100755 source/shared_lib/include/platform/win32/platform_util.h mode change 100644 => 100755 source/shared_lib/sources/graphics/gl/shader_gl.cpp diff --git a/mk/linux/data b/mk/linux/data new file mode 120000 index 000000000..7bd9ad7ce --- /dev/null +++ b/mk/linux/data @@ -0,0 +1 @@ +/home/softcoder/Code/glest/megaglest/data/glest_game/data \ No newline at end of file diff --git a/mk/linux/glest.ini b/mk/linux/glest.ini index 1b6307fcf..44672b79e 100644 --- a/mk/linux/glest.ini +++ b/mk/linux/glest.ini @@ -1,4 +1,4 @@ -; === Properties File === +; === propertyMap File === AiLog=0 AiRedir=0 @@ -24,13 +24,13 @@ FontConsole=-*-*-*-*-*-*-12-*-*-*-*-*-*-* FontDisplay=-*-*-*-*-*-*-12-*-*-*-*-*-*-* FontMenu=-*-*-*-*-*-*-12-*-*-*-*-*-*-* Lang=english -MaxLights=1 -NetworkConsistencyChecks=1 +MaxLights=3 +NetworkConsistencyChecks=0 PhotoMode=0 RefreshFrequency=75 -ScreenHeight=768 -ScreenWidth=1024 -ServerIp=192.168.1.102 +ScreenHeight=984 +ScreenWidth=1680 +ServerIp=200.200.200.200 ServerPort=6666 ShadowAlpha=0.2 ShadowFrameSkip=2 @@ -38,10 +38,10 @@ ShadowTextureSize=512 Shadows=Projected SoundStaticBuffers=16 SoundStreamingBuffers=4 -SoundVolumeAmbient=80 -SoundVolumeFx=80 -SoundVolumeMusic=90 +SoundVolumeAmbient=90 +SoundVolumeFx=100 +SoundVolumeMusic=0 StencilBits=0 Textures3D=1 UnitParticles=1 -Windowed=0 +Windowed=1 diff --git a/mk/linux/glest_game b/mk/linux/glest_game new file mode 120000 index 000000000..11e824c95 --- /dev/null +++ b/mk/linux/glest_game @@ -0,0 +1 @@ +../../source/glest_game \ No newline at end of file diff --git a/mk/linux/glest_map_editor b/mk/linux/glest_map_editor new file mode 120000 index 000000000..4ac78b161 --- /dev/null +++ b/mk/linux/glest_map_editor @@ -0,0 +1 @@ +../../source/glest_map_editor \ No newline at end of file diff --git a/mk/linux/maps b/mk/linux/maps new file mode 120000 index 000000000..e8a01a476 --- /dev/null +++ b/mk/linux/maps @@ -0,0 +1 @@ +/home/softcoder/Code/glest/megaglest/data/glest_game/maps \ No newline at end of file diff --git a/mk/linux/scenarios b/mk/linux/scenarios new file mode 120000 index 000000000..2e5070188 --- /dev/null +++ b/mk/linux/scenarios @@ -0,0 +1 @@ +/home/softcoder/Code/glest/megaglest/data/glest_game/scenarios \ No newline at end of file diff --git a/mk/linux/screenshots b/mk/linux/screenshots new file mode 120000 index 000000000..9baab48cf --- /dev/null +++ b/mk/linux/screenshots @@ -0,0 +1 @@ +/home/softcoder/Code/glest/megaglest/data/glest_game/screenshots \ No newline at end of file diff --git a/mk/linux/servers.ini b/mk/linux/servers.ini new file mode 100644 index 000000000..abc47a895 --- /dev/null +++ b/mk/linux/servers.ini @@ -0,0 +1,3 @@ +; === propertyMap File === + +Martino=192.168.1.100 diff --git a/mk/linux/shared_lib b/mk/linux/shared_lib new file mode 120000 index 000000000..fa1ad5504 --- /dev/null +++ b/mk/linux/shared_lib @@ -0,0 +1 @@ +../../source/shared_lib \ No newline at end of file diff --git a/mk/linux/techs b/mk/linux/techs new file mode 120000 index 000000000..a93efc292 --- /dev/null +++ b/mk/linux/techs @@ -0,0 +1 @@ +/home/softcoder/Code/glest/megaglest/data/glest_game/techs \ No newline at end of file diff --git a/mk/linux/tilesets b/mk/linux/tilesets new file mode 120000 index 000000000..743429065 --- /dev/null +++ b/mk/linux/tilesets @@ -0,0 +1 @@ +/home/softcoder/Code/glest/megaglest/data/glest_game/tilesets \ No newline at end of file diff --git a/mk/linux/tutorials b/mk/linux/tutorials new file mode 120000 index 000000000..03c60410f --- /dev/null +++ b/mk/linux/tutorials @@ -0,0 +1 @@ +/home/softcoder/Code/glest/megaglest/data/glest_game/tutorials \ No newline at end of file diff --git a/mk/windoze/Glest.sln b/mk/windoze/Glest.sln old mode 100644 new mode 100755 diff --git a/mk/windoze/Glest.suo b/mk/windoze/Glest.suo old mode 100644 new mode 100755 index 5b51999fb90b1c7aeee63043645e8a102207c00f..3a3a2393fd4bf92884534372259c2985917ed74f GIT binary patch delta 1491 zcmZWpTTGK@82;Y&|4TV{m9(|#80$Kkh^vJaJWOjTopDv62sju;P6ZD`MQs!iN%5FD z#-xwNnK*}RS96)f-|Wi7&Ml0PECRdP1u-l!yI6?2Wj9+k*!!1`i|tFE{O|F9kKY%Y z)W#;Yx2-63@5H@Uh-r!J&^9bKa#fauk%c^~5((^s0PO_)rEmbKSn6=>#Lr_NiuHzLn$qDV>-Sk@^Cvz|zk%<2{P z`<#?NEq$bWmFb@gl|JhQTHPgDMO1W(BjT7iBwS)Y>&%QZDDP~=L0cgWU~o+bE;X5C zRp&u&xC%p?T$tW(OG;MZCwKW+z7h7~2tw{FG=yq*2d3*BFn9-GtaT}_lHJ6ku*W?X z44ZW;nVaB!*O8P6%)DrZ&y#??Is{*FKBkYEaHe$gr-@Rcc04G%gD;$Vb#~-aPOrZv zC5H{m=6l)yZqHYo-r`7g5u`1DDZ}18!rj0nMp$kaUE+YUw3Q^>cRMH>pKNW#vmQHd zR{(ds8!@`mgzhFQ3SCCrdvgfB*ZOG<9&GEyNY5TD?9IUFHanzdKc<8ESX-l)9ULrz zuP0jb)vlI_IK0X+4 zmf|fp@oiNZcQL?Y%Sk$v;%HqJ43PpXoU>tmR$8gcJ8OlbZ30hbkI`r{^TX|NJTH={ zh=Xk8?o?7YW+HDR{6UGV)_es=n-3utb|n97#Ne)r%2?%Ig0I<#*lsUEkxd-D5OZrR z@O4P2jr1VUQ4ecpA%6!b&iCRF3{?hr_F1_}ZD_uog)ckxn5_w?w(aRkGI~r!tw;>^ z%iB4)z|q+n#T}W{#Je8C-&N_hv#?*)@VU-N-C}W*=?#q0luXaxF$QLWt6}>t3kOcr zTA2TV(JQ(|N9wu-nU8TJ){Pz3z;ClDbD?^k?hyPfYt^I`&prn!Eyw3IFciCaH#Yol z;@ii1vhZ7N9@n#0@tw={yMEO^R^OYYrLblt!STi;(q#CEluTIrAwOAach$o!txysZ PXXuQ`Ua~mvrXZ delta 2060 zcma)7ZA?>F7(S=m)>5!7SX;ot3NoyUtRRKDDb|6q@mYo#gbMOeJ_{waI>f2f8Rr~2 z;31M3XOJvgvLy@in$78^%o&3&i_Z9CSr+5Wvh4>^v+Tz-3*CD_-DE8BB+tF?*LlzT zaqfGA<6*(^u+ct6__K_$6hb=QQ9P6R98osHTtWt6Il)1g42443^e!Z0^z|gYT9vo5PrbzhOkN$AnP9L|LsVTYUFC&4DE zlzI{r;l92AUrXr-L>+!1jB(0fDao@4F@$eF%8b4{c_$>~H56ehL6r61a+&xu@~Y@J zBwfvalg5!|1B@o4u6`C>n<;IUJ@N9GNzJ)&DuspQ{eeP$5Yxj|i-_K3m3!j$^YAXB zMWlQ2lcx?n<`g8yXJNF~g{Dd^v}O(Q$1!Zq97%}A4YLc4wn1Eo&%tP60$lb49FI4n z(iX{kv1hLbHR%SNEX>)`Kl|;1aWWA(fd4Mj8I4JAg%ff{`AARSF4q^IVz6#$~T}ZM?K<{aBICq*+PbSh+16> z^UfuFE>VY&oRbCHW+R+-JW0s2VMi@EQlT`@ah^_!xP^|lqDZU zHEMWWYGpBPrIu80N6#SxSHM^J7T*PaxfOkNaeR<89eA)gmD;u@s}O0`Nl5kUVXeO< zmC{Z)Uk}O`Pg4)aiUYa>GtNnLSHsa@;Ux%_ZYN*DgQmrSiBcnOlnf%XWEf+Y+Hl*| zcXGo%zM`H=+CXR|cnD2|W<4mZlI@Rx}mSO+T9 z${dRE$m4T^uf$M;_9Ll$FI9Oxbtsj)QP*67;QGjc9RZ$8RV$^&BvH!AI9eHr!3ytG z6FC*87RQ{)=&eu>?B9mLjR6FzI^o>ig03nF!RkKTt~w5XVW*sPJ&q$~(?ve~@MtG~ zt2u}ww@r4mjw`TviAA>fom_WxM#1`re3&SRL|)>%H3vK3^@;#fJ2!mZ3tXLy)}tz)gsOVk#jq?J0G9-Asn3#Rps|Ix?7 zX48mhrWfwFU+z!V&lmIa0O84-mgwGy6W15gEl9vOqpOkCkc3;;rC707%)E5MDgrfe zYH>N#L6@*8+ejl*+C4(TVv4zw@+fBkR!8vAT-!=n1Sq=>mQS({l3AIHGWD@$dJ2h! zEn!_xNK#2wOgixmJ@P56I%dd(T|Ig7F|UQ2`2LF@>lD z&-Ur3iyL6I6od!?uI;fY^Vl5eCfA5xfmiW3&C&KQKJM)jQ=YM3GdL0@15bga+lzA* zNjMmABZ)4c)1D{);;#xrdd))Qo~@+Y{B-`Ne|*CEKg-QAVJPCS;Y7iFnz9xQ4tXD5 oHm%INLlMxwZ=!LtSa$Byy}0OU!Y1ePwo7GUynsS?j9iKP8`WYyX8-^I diff --git a/mk/windoze/g3d_viewer.vcproj b/mk/windoze/g3d_viewer.vcproj old mode 100644 new mode 100755 diff --git a/mk/windoze/glest.ico b/mk/windoze/glest.ico old mode 100644 new mode 100755 diff --git a/mk/windoze/glest.rc b/mk/windoze/glest.rc old mode 100644 new mode 100755 diff --git a/mk/windoze/glest_editor.vcproj b/mk/windoze/glest_editor.vcproj old mode 100644 new mode 100755 diff --git a/mk/windoze/glest_game.vcproj b/mk/windoze/glest_game.vcproj old mode 100644 new mode 100755 diff --git a/mk/windoze/shared_lib.vcproj b/mk/windoze/shared_lib.vcproj old mode 100644 new mode 100755 diff --git a/source/glest_game/graphics/renderer.cpp b/source/glest_game/graphics/renderer.cpp index 55d7700b7..8ebb479d6 100644 --- a/source/glest_game/graphics/renderer.cpp +++ b/source/glest_game/graphics/renderer.cpp @@ -562,6 +562,14 @@ void Renderer::renderMouse3d(){ glColor4fv(color.ptr()); glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, color.ptr()); const Model *buildingModel= building->getFirstStOfClass(scStop)->getAnimation(); + + //!!! + float rotateAmount = gui->getUnitTypeBuildRotation(building->getId()); + if(rotateAmount >= 0) { + //if(Socket::enableDebugText) printf("In [%s::%s] rotate unit id = %d amount = %f\n",__FILE__,__FUNCTION__,building->getId(),rotateAmount); + glRotatef(rotateAmount, 0.f, 1.f, 0.f); + } + buildingModel->updateInterpolationData(0.f, false); modelRenderer->render(buildingModel); glDisable(GL_COLOR_MATERIAL); @@ -1350,6 +1358,14 @@ void Renderer::renderUnits(){ //render const Model *model= unit->getCurrentModel(); model->updateInterpolationData(unit->getAnimProgress(), unit->isAlive()); + + //!!! + float rotateAmount = unit->getRotateAmount(); + if(rotateAmount >= 0) { + //if(Socket::enableDebugText) printf("In [%s::%s] rotate unit id = %d amount = %f\n",__FILE__,__FUNCTION__,unit->getId(),rotateAmount); + glRotatef(rotateAmount, 0.f, 1.f, 0.f); + } + modelRenderer->render(model); triangleCount+= model->getTriangleCount(); pointCount+= model->getVertexCount(); @@ -2328,6 +2344,14 @@ void Renderer::renderUnitsFast(){ //render const Model *model= unit->getCurrentModel(); model->updateInterpolationVertices(unit->getAnimProgress(), unit->isAlive()); + + //!!! + float rotateAmount = unit->getRotateAmount(); + if(rotateAmount >= 0) { + //if(Socket::enableDebugText) printf("In [%s::%s] rotate unit id = %d amount = %f\n",__FILE__,__FUNCTION__,unit->getId(),rotateAmount); + glRotatef(rotateAmount, 0.f, 1.f, 0.f); + } + modelRenderer->render(model); glPopMatrix(); diff --git a/source/glest_game/graphics/renderer.h b/source/glest_game/graphics/renderer.h index a464cbd4b..fc6766a5d 100644 --- a/source/glest_game/graphics/renderer.h +++ b/source/glest_game/graphics/renderer.h @@ -3,9 +3,9 @@ // // Copyright (C) 2001-2008 Martiño Figueroa // -// You can redistribute this code 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 +// You can redistribute this code 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 // ============================================================== @@ -121,7 +121,7 @@ public: sCount }; -private: +private: //config int maxLights; bool photoMode; @@ -134,7 +134,7 @@ private: //game const Game *game; - + //misc int triangleCount; int pointCount; @@ -163,7 +163,7 @@ private: int shadowMapFrame; //water - float waterAnim; + float waterAnim; private: Renderer(); @@ -184,7 +184,7 @@ public: void end(); void endMenu(); void endGame(); - + //get int getTriangleCount() const {return triangleCount;} int getPointCount() const {return pointCount;} @@ -208,7 +208,7 @@ public: void loadGameCameraMatrix(); void loadCameraMatrix(const Camera *camera); void computeVisibleQuad(); - + //basic rendering void renderMouse2d(int mouseX, int mouseY, int anim, float fade= 0.f); void renderMouse3d(); @@ -220,8 +220,8 @@ public: void renderSelectionQuad(); void renderText(const string &text, const Font2D *font, float alpha, int x, int y, bool centered= false); void renderText(const string &text, const Font2D *font, const Vec3f &color, int x, int y, bool centered= false); - void renderTextShadow(const string &text, const Font2D *font, int x, int y, bool centered= false); - + void renderTextShadow(const string &text, const Font2D *font, int x, int y, bool centered= false); + //components void renderLabel(const GraphicLabel *label); void renderButton(const GraphicButton *button); @@ -238,7 +238,7 @@ public: void renderMinimap(); void renderDisplay(); void renderMenuBackground(const MenuBackground *menuBackground); - + //computing bool computePosition(const Vec2i &screenPos, Vec2i &worldPos); void computeSelected(Selection::UnitContainer &units, const Vec2i &posDown, const Vec2i &posUp); @@ -247,7 +247,7 @@ public: string getGlInfo(); string getGlMoreInfo(); void autoConfig(); - + //clear void clearBuffers(); void clearZBuffer(); @@ -273,11 +273,11 @@ private: Vec3f computeLightColor(float time); Vec4f computeWaterColor(float waterLevel, float cellHeight); void checkExtension(const string &extension, const string &msg); - + //selection render void renderObjectsFast(); void renderUnitsFast(); - + //gl requirements void checkGlCaps(); void checkGlOptionalCaps(); @@ -297,7 +297,7 @@ private: void renderProgressBar(int size, int x, int y, Font2D *font); void renderTile(const Vec2i &pos); void renderQuad(int x, int y, int w, int h, const Texture2D *texture); - + //static static Texture2D::Filter strToTextureFilter(const string &s); }; diff --git a/source/glest_game/gui/gui.cpp b/source/glest_game/gui/gui.cpp index c5dda9a38..674cb7b5b 100644 --- a/source/glest_game/gui/gui.cpp +++ b/source/glest_game/gui/gui.cpp @@ -1,11 +1,12 @@ // ============================================================== +// ============================================================== // This file is part of Glest (www.glest.org) // // Copyright (C) 2001-2008 Martiño Figueroa // -// You can redistribute this code 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 +// You can redistribute this code 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 // ============================================================== @@ -58,7 +59,7 @@ void Mouse3d::update(){ } // =============================== -// class SelectionQuad +// class SelectionQuad // =============================== SelectionQuad::SelectionQuad(){ @@ -87,6 +88,8 @@ void SelectionQuad::disable(){ //constructor Gui::Gui(){ + if(Socket::enableDebugText) printf("In [%s::%s] START\n",__FILE__,__FUNCTION__); + posObjWorld= Vec2i(54, 14); computeSelection= false; validPosObjWorld= false; @@ -96,6 +99,8 @@ Gui::Gui(){ selectingPos= false; selectingMeetingPoint= false; activePos= invalidPos; + + if(Socket::enableDebugText) printf("In [%s::%s] END\n",__FILE__,__FUNCTION__); } void Gui::init(Game *game){ @@ -110,23 +115,23 @@ void Gui::end(){ selection.clear(); } -// ==================== get ==================== +// ==================== get ==================== const UnitType *Gui::getBuilding() const{ assert(selectingBuilding); return choosenBuildingType; } -// ==================== is ==================== +// ==================== is ==================== bool Gui::isPlacingBuilding() const{ return isSelectingPos() && activeCommandType!=NULL && activeCommandType->getClass()==ccBuild; } -// ==================== set ==================== +// ==================== set ==================== void Gui::invalidatePosObjWorld(){ - validPosObjWorld= false; + validPosObjWorld= false; } void Gui::setComputeSelectionFlag(){ @@ -134,7 +139,7 @@ void Gui::setComputeSelectionFlag(){ } -// ==================== reset state ==================== +// ==================== reset state ==================== void Gui::resetState(){ selectingBuilding= false; @@ -145,7 +150,7 @@ void Gui::resetState(){ activeCommandType= NULL; } -// ==================== events ==================== +// ==================== events ==================== void Gui::update(){ setComputeSelectionFlag(); @@ -167,9 +172,14 @@ void Gui::mouseDownLeftDisplay(int x, int y){ if(posDisplay!= invalidPos){ if(selection.isComandable()){ if(selectingBuilding){ + + //if(Socket::enableDebugText) printf("In [%s::%s] selectingBuilding == true\n",__FILE__,__FUNCTION__); + mouseDownDisplayUnitBuild(posDisplay); } else{ + //if(Socket::enableDebugText) printf("In [%s::%s] selectingBuilding == false\n",__FILE__,__FUNCTION__); + mouseDownDisplayUnitSkills(posDisplay); } } @@ -182,34 +192,55 @@ void Gui::mouseDownLeftDisplay(int x, int y){ } void Gui::mouseMoveDisplay(int x, int y){ + //if(Socket::enableDebugText) printf("In [%s::%s] START\n",__FILE__,__FUNCTION__); + computeInfoString(computePosDisplay(x, y)); } void Gui::mouseDownLeftGraphics(int x, int y){ + + //if(Socket::enableDebugText) printf("In [%s::%s] START\n",__FILE__,__FUNCTION__); + if(selectingPos){ + //if(Socket::enableDebugText) printf("In [%s::%s] selectingPos == true\n",__FILE__,__FUNCTION__); + //give standard orders giveTwoClickOrders(x, y); resetState(); } //set meeting point else if(selectingMeetingPoint){ + if(Socket::enableDebugText) printf("In [%s::%s] selectingMeetingPoint == true\n",__FILE__,__FUNCTION__); + if(selection.isComandable()){ + + if(Socket::enableDebugText) printf("In [%s::%s] selection.isComandable() == true\n",__FILE__,__FUNCTION__); + Vec2i targetPos; if(Renderer::getInstance().computePosition(Vec2i(x, y), targetPos)){ + + if(Socket::enableDebugText) printf("In [%s::%s] computePosition() == true\n",__FILE__,__FUNCTION__); + commander->trySetMeetingPoint(selection.getFrontUnit(), targetPos); } } resetState(); } else{ + if(Socket::enableDebugText) printf("In [%s::%s] selectionQuad()\n",__FILE__,__FUNCTION__); + selectionQuad.setPosDown(Vec2i(x, y)); computeSelected(false); } computeDisplay(); + + //if(Socket::enableDebugText) printf("In [%s::%s] END\n",__FILE__,__FUNCTION__); } void Gui::mouseDownRightGraphics(int x, int y){ + //if(Socket::enableDebugText) printf("In [%s::%s] START\n",__FILE__,__FUNCTION__); + if(selectingPos || selectingMeetingPoint){ resetState(); } @@ -217,25 +248,31 @@ void Gui::mouseDownRightGraphics(int x, int y){ giveDefaultOrders(x, y); } computeDisplay(); + + //if(Socket::enableDebugText) printf("In [%s::%s] END\n",__FILE__,__FUNCTION__); } void Gui::mouseUpLeftGraphics(int x, int y){ + //if(Socket::enableDebugText) printf("In [%s::%s] START\n",__FILE__,__FUNCTION__); + if(!selectingPos && !selectingMeetingPoint){ if(selectionQuad.isEnabled()){ selectionQuad.setPosUp(Vec2i(x, y)); if(selection.isComandable() && random.randRange(0, 1)==0){ SoundRenderer::getInstance().playFx( selection.getFrontUnit()->getType()->getSelectionSound(), - selection.getFrontUnit()->getCurrVector(), + selection.getFrontUnit()->getCurrVector(), gameCamera->getPos()); } selectionQuad.disable(); } } + + //if(Socket::enableDebugText) printf("In [%s::%s] END\n",__FILE__,__FUNCTION__); } void Gui::mouseMoveGraphics(int x, int y){ - + //compute selection if(selectionQuad.isEnabled()){ selectionQuad.setPosUp(Vec2i(x, y)); @@ -247,6 +284,8 @@ void Gui::mouseMoveGraphics(int x, int y){ //compute position for building if(isPlacingBuilding()){ + //if(Socket::enableDebugText) printf("In [%s::%s] isPlacingBuilding() == true\n",__FILE__,__FUNCTION__); + validPosObjWorld= Renderer::getInstance().computePosition(Vec2i(x,y), posObjWorld); } @@ -270,7 +309,20 @@ void Gui::groupKey(int groupIndex){ } } +float Gui::getUnitTypeBuildRotation(int unitId) const { + float rotationValue = -1; + + if(unitTypeBuildRotation.find(unitId) != unitTypeBuildRotation.end()) { + rotationValue = unitTypeBuildRotation.find(unitId)->second; + } + + return rotationValue; +} + void Gui::hotKey(char key){ + + if(Socket::enableDebugText) printf("In [%s::%s] key = [%c]\n",__FILE__,__FUNCTION__,key); + if(key==' '){ centerCameraOnSelection(); } @@ -281,7 +333,27 @@ void Gui::hotKey(char key){ selectInterestingUnit(iutBuiltBuilding); } else if(key=='R'){ - selectInterestingUnit(iutProducer); + //!!! + if(isPlacingBuilding()){ + const UnitType *unitType = getBuilding(); + float unitTypeRotation = getUnitTypeBuildRotation(unitType->getId()); + + if(Socket::enableDebugText) printf("In [%s::%s] unitType->getId() = %d unitTypeRotation = %f\n",__FILE__,__FUNCTION__,unitType->getId(),unitTypeRotation); + + if(unitTypeRotation < 0) { + unitTypeRotation = 0; + } + unitTypeRotation += 90; + if(unitTypeRotation >= 360) { + unitTypeRotation = 0; + } + unitTypeBuildRotation[unitType->getId()] = unitTypeRotation; + + if(Socket::enableDebugText) printf("In [%s::%s] unitType->getId() = %d NEW unitTypeRotation = %f\n",__FILE__,__FUNCTION__,unitType->getId(),unitTypeRotation); + } + else { + selectInterestingUnit(iutProducer); + } } else if(key=='D'){ selectInterestingUnit(iutDamaged); @@ -310,10 +382,10 @@ void Gui::onSelectionChanged(){ void Gui::giveOneClickOrders(){ CommandResult result; if(selection.isUniform()){ - result= commander->tryGiveCommand(&selection, activeCommandType); + result= commander->tryGiveCommand(&selection, activeCommandType); } else{ - result= commander->tryGiveCommand(&selection, activeCommandClass); + result= commander->tryGiveCommand(&selection, activeCommandClass); } addOrdersResultToConsole(activeCommandClass, result); activeCommandType= NULL; @@ -337,11 +409,11 @@ void Gui::giveDefaultOrders(int x, int y){ addOrdersResultToConsole(activeCommandClass, result); if(result == crSuccess || result == crSomeFailed){ mouse3d.enable(); - + if(random.randRange(0, 1)==0){ SoundRenderer::getInstance().playFx( selection.getFrontUnit()->getType()->getCommandSound(), - selection.getFrontUnit()->getCurrVector(), + selection.getFrontUnit()->getCurrVector(), gameCamera->getPos()); } } @@ -351,7 +423,7 @@ void Gui::giveDefaultOrders(int x, int y){ } void Gui::giveTwoClickOrders(int x, int y){ - + CommandResult result; //compute target @@ -365,26 +437,26 @@ void Gui::giveTwoClickOrders(int x, int y){ //give orders to the units of this faction if(!selectingBuilding){ if(selection.isUniform()){ - result= commander->tryGiveCommand(&selection, activeCommandType, targetPos, targetUnit); + result= commander->tryGiveCommand(&selection, activeCommandType, targetPos, targetUnit); } else{ - result= commander->tryGiveCommand(&selection, activeCommandClass, targetPos, targetUnit); + result= commander->tryGiveCommand(&selection, activeCommandClass, targetPos, targetUnit); } } else{ //selecting building - result= commander->tryGiveCommand( selection.getFrontUnit(), activeCommandType, posObjWorld, choosenBuildingType ); + result= commander->tryGiveCommand( selection.getFrontUnit(), activeCommandType, posObjWorld, choosenBuildingType ); } - + //graphical result addOrdersResultToConsole(activeCommandClass, result); if(result == crSuccess || result == crSomeFailed){ mouse3d.enable(); - + if(random.randRange(0, 1)==0){ SoundRenderer::getInstance().playFx( selection.getFrontUnit()->getType()->getCommandSound(), - selection.getFrontUnit()->getCurrVector(), + selection.getFrontUnit()->getCurrVector(), gameCamera->getPos()); } } @@ -459,8 +531,8 @@ void Gui::mouseDownDisplayUnitSkills(int posDisplay){ if(!selection.isEmpty()){ if(posDisplay != cancelPos){ if(posDisplay!=meetingPointPos){ - const Unit *unit= selection.getFrontUnit(); - + const Unit *unit= selection.getFrontUnit(); + //uniform selection if(selection.isUniform()){ if(unit->getFaction()->reqsOk(display.getCommandType(posDisplay))){ @@ -510,7 +582,7 @@ void Gui::mouseDownDisplayUnitSkills(int posDisplay){ } void Gui::mouseDownDisplayUnitBuild(int posDisplay){ - int factionIndex= world->getThisFactionIndex(); + int factionIndex= world->getThisFactionIndex(); if(posDisplay==cancelPos){ resetState(); @@ -524,7 +596,7 @@ void Gui::mouseDownDisplayUnitBuild(int posDisplay){ assert(choosenBuildingType!=NULL); selectingPos= true;; activePos= posDisplay; - } + } } } } @@ -561,11 +633,11 @@ void Gui::computeInfoString(int posDisplay){ display.setInfoText(lang.get("AlreadyUpgraded")); } else{ - display.setInfoText(ct->getReqDesc()); + display.setInfoText(ct->getReqDesc()); } } else{ - display.setInfoText(ct->getReqDesc()); + display.setInfoText(ct->getReqDesc()); } } } @@ -599,9 +671,9 @@ void Gui::computeDisplay(){ //init display.clear(); - + // ================ PART 1 ================ - + //title, text and progress bar if(selection.getCount()==1){ display.setTitle(selection.getFrontUnit()->getFullName()); @@ -613,7 +685,7 @@ void Gui::computeDisplay(){ for(int i=0; igetType()->getImage()); } - + // ================ PART 2 ================ if(selectingPos || selectingMeetingPoint){ @@ -643,7 +715,7 @@ void Gui::computeDisplay(){ int morphPos= 8; for(int i=0; igetCommandTypeCount(); ++i){ int displayPos= i; - const CommandType *ct= ut->getCommandType(i); + const CommandType *ct= ut->getCommandType(i); if(ct->getClass()==ccMorph){ displayPos= morphPos++; } @@ -665,7 +737,7 @@ void Gui::computeDisplay(){ display.setCommandClass(lastCommand, cc); lastCommand++; } - } + } } } else{ @@ -687,9 +759,9 @@ void Gui::computeDisplay(){ int Gui::computePosDisplay(int x, int y){ int posDisplay= display.computeDownIndex(x, y); - + if(posDisplay<0 || posDisplay>=Display::downCellCount){ - posDisplay= invalidPos; + posDisplay= invalidPos; } else if(selection.isComandable()){ if(posDisplay!=cancelPos){ @@ -697,7 +769,7 @@ int Gui::computePosDisplay(int x, int y){ if(!selectingBuilding){ //standard selection if(display.getCommandClass(posDisplay)==ccNull && display.getCommandType(posDisplay)==NULL){ - posDisplay= invalidPos; + posDisplay= invalidPos; } } else{ @@ -710,17 +782,17 @@ int Gui::computePosDisplay(int x, int y){ } } } - else{ + else{ //check meeting point if(!selection.isMeetable()){ - posDisplay= invalidPos; + posDisplay= invalidPos; } } } - else{ + else{ //check cancel button if(!selection.isCancelable()){ - posDisplay= invalidPos; + posDisplay= invalidPos; } } } @@ -732,11 +804,11 @@ int Gui::computePosDisplay(int x, int y){ } void Gui::addOrdersResultToConsole(CommandClass cc, CommandResult result){ - + switch(result){ - case crSuccess: + case crSuccess: break; - case crFailReqs: + case crFailReqs: switch(cc){ case ccBuild: console->addStdMessage("BuildingNoReqs"); @@ -766,7 +838,7 @@ void Gui::addOrdersResultToConsole(CommandClass cc, CommandResult result){ break; } break; - + case crFailUndefined: console->addStdMessage("InvalidOrder"); break; @@ -827,7 +899,7 @@ bool Gui::computeTarget(const Vec2i &screenPos, Vec2i &targetPos, const Unit *&t Renderer &renderer= Renderer::getInstance(); renderer.computeSelected(uc, screenPos, screenPos); validPosObjWorld= false; - + if(!uc.empty()){ targetUnit= uc.front(); targetPos= targetUnit->getPos(); diff --git a/source/glest_game/gui/gui.h b/source/glest_game/gui/gui.h index a20cb727b..738889131 100644 --- a/source/glest_game/gui/gui.h +++ b/source/glest_game/gui/gui.h @@ -3,9 +3,9 @@ // // Copyright (C) 2001-2008 Martiño Figueroa // -// You can redistribute this code 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 +// You can redistribute this code 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 // ============================================================== @@ -19,6 +19,7 @@ #include "console.h" #include "selection.h" #include "random.h" +#include using Shared::Util::Random; @@ -52,10 +53,10 @@ private: public: Mouse3d(); - + void enable(); void update(); - + bool isEnabled() const {return enabled;} float getFade() const {return fade;} int getRot() const {return rot;} @@ -84,7 +85,7 @@ public: }; // ===================================================== -// class Gui +// class Gui // /// In game GUI // ===================================================== @@ -106,7 +107,7 @@ private: const World *world; GameCamera *gameCamera; Console *console; - + //Positions Vec2i posObjWorld; //world coords bool validPosObjWorld; @@ -129,6 +130,8 @@ private: bool selectingPos; bool selectingMeetingPoint; + std::map unitTypeBuildRotation; + public: Gui(); void init(Game *game); @@ -137,7 +140,7 @@ public: //get Vec2i getPosObjWorld() const {return posObjWorld;} const UnitType *getBuilding() const; - + const Mouse3d *getMouse3d() const {return &mouse3d;} const Display *getDisplay() const {return &display;} const Selection *getSelection() const {return &selection;} @@ -171,8 +174,10 @@ public: //misc void onSelectionChanged(); + float getUnitTypeBuildRotation(int unitId) const; + private: - + //orders void giveDefaultOrders(int x, int y); void giveOneClickOrders(); diff --git a/source/glest_game/network/client_interface.cpp b/source/glest_game/network/client_interface.cpp old mode 100644 new mode 100755 diff --git a/source/glest_game/type_instances/unit.cpp b/source/glest_game/type_instances/unit.cpp index 71f2f8b7a..a9ca4f629 100644 --- a/source/glest_game/type_instances/unit.cpp +++ b/source/glest_game/type_instances/unit.cpp @@ -3,12 +3,12 @@ // // Copyright (C) 2001-2008 Marti�o Figueroa // -// You can redistribute this code 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 +// You can redistribute this code 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 // ============================================================== -#include "faction.h" +#include "faction.h" #include @@ -24,6 +24,7 @@ #include "core_data.h" #include "renderer.h" #include "leak_dumper.h" +#include "socket.h" using namespace Shared::Graphics; using namespace Shared::Util; @@ -103,18 +104,27 @@ const int Unit::invalidId= -1; // ============================ Constructor & destructor ============================= -Unit::Unit(int id, const Vec2i &pos, const UnitType *type, Faction *faction, Map *map){ +Unit::Unit(int id, const Vec2i &pos, const UnitType *type, Faction *faction, Map *map, float unitPlacementRotation) { + + if(Socket::enableDebugText) printf("In [%s::%s] START\n",__FILE__,__FUNCTION__); + Random random; - + this->pos=pos; this->type=type; this->faction=faction; this->map= map; this->id= id; - + level= NULL; + cellMap= NULL; + + if(Socket::enableDebugText) printf("In [%s::%s] A\n",__FILE__,__FUNCTION__); + setRotateAmount(unitPlacementRotation); + if(Socket::enableDebugText) printf("In [%s::%s] B unit id = %d [%s] rotate amount = %f\n",__FILE__,__FUNCTION__,getId(), getFullName().c_str(),unitPlacementRotation); + Config &config= Config::getInstance(); showUnitParticles= config.getBool("UnitParticles"); - + lastPos= pos; progress= 0; lastAnimProgress= 0; @@ -126,7 +136,7 @@ Unit::Unit(int id, const Vec2i &pos, const UnitType *type, Faction *faction, Map deadCount= 0; hp= type->getMaxHp()/20; toBeUndertaken= false; - level= NULL; + highlight= 0.f; meetingPos= pos; alive= true; @@ -135,7 +145,7 @@ Unit::Unit(int id, const Vec2i &pos, const UnitType *type, Faction *faction, Map random.init(id); rot+= random.randRange(-5, 5); - + rotation= rot; lastRotation= rot; targetRotation= rot; @@ -149,6 +159,8 @@ Unit::Unit(int id, const Vec2i &pos, const UnitType *type, Faction *faction, Map //starting skill this->currSkill=getType()->getFirstStOfClass(scStop); + + if(Socket::enableDebugText) printf("In [%s::%s] END\n",__FILE__,__FUNCTION__); } Unit::~Unit(){ @@ -163,6 +175,9 @@ Unit::~Unit(){ unitParticleSystems.pop_back(); } stopDamageParticles(); + + delete [] cellMap; + cellMap = NULL; } // ====================================== get ====================================== @@ -184,9 +199,8 @@ Vec2f Unit::getFloatCenteredPos() const{ } Vec2i Unit::getCellPos() const{ - if(type->hasCellMap()){ - + //find nearest pos to center that is free Vec2i centeredPos= getCenteredPos(); float nearestDist= -1.f; @@ -194,7 +208,7 @@ Vec2i Unit::getCellPos() const{ for(int i=0; igetSize(); ++i){ for(int j=0; jgetSize(); ++j){ - if(type->getCellMapCell(i, j)){ + if(getCellMapCell(i, j)){ Vec2i currPos= pos + Vec2i(i, j); float dist= currPos.dist(centeredPos); if(nearestDist==-1.f || distgetMaxHp()==0){ + if(type->getMaxHp()==0){ return 0.f; } else{ @@ -256,11 +270,14 @@ const Level *Unit::getNextLevel() const{ } string Unit::getFullName() const{ - string str; - if(level!=NULL){ - str+= level->getName() + " "; + string str=""; + if(level != NULL){ + str += (level->getName() + " "); } - str+= type->getName(); + if(type == NULL) { + throw runtime_error("type == NULL in Unit::getFullName()!"); + } + str += type->getName(); return str; } @@ -273,7 +290,7 @@ bool Unit::isOperative() const{ bool Unit::isBeingBuilt() const{ return currSkill->getClass()==scBeBuilt; } - + bool Unit::isBuilt() const{ return !isBeingBuilt(); } @@ -292,7 +309,7 @@ bool Unit::isDamaged() const{ bool Unit::isInteresting(InterestingUnitType iut) const{ switch(iut){ - case iutIdleHarvester: + case iutIdleHarvester: if(type->hasCommandClass(ccHarvest)){ if(!commands.empty()){ const CommandType *ct= commands.front()->getCommandType(); @@ -303,11 +320,11 @@ bool Unit::isInteresting(InterestingUnitType iut) const{ } return false; - case iutBuiltBuilding: + case iutBuiltBuilding: return type->hasSkillClass(scBeBuilt) && isBuilt(); - case iutProducer: + case iutProducer: return type->hasSkillClass(scProduce); - case iutDamaged: + case iutDamaged: return isDamaged(); case iutStore: return type->getStoredResourceCount()>0; @@ -322,13 +339,13 @@ void Unit::setCurrSkill(const SkillType *currSkill){ if(currSkill->getClass()!=this->currSkill->getClass()){ animProgress= 0; lastAnimProgress= 0; - + while(!unitParticleSystems.empty()){ unitParticleSystems.back()->fade(); unitParticleSystems.pop_back(); } } - if(showUnitParticles && (!currSkill->unitParticleSystemTypes.empty()) && + if(showUnitParticles && (!currSkill->unitParticleSystemTypes.empty()) && (unitParticleSystems.empty()) ){ for(UnitParticleSystemTypes::const_iterator it= currSkill->unitParticleSystemTypes.begin(); it!=currSkill->unitParticleSystemTypes.end(); ++it){ UnitParticleSystem *ups; @@ -373,7 +390,7 @@ void Unit::setTargetPos(const Vec2i &targetPos){ targetRef= NULL; this->targetPos= targetPos; -} +} void Unit::setVisible(const bool visible){ for(UnitParticleSystems::iterator it= unitParticleSystems.begin(); it!=unitParticleSystems.end(); ++it){ @@ -383,11 +400,11 @@ void Unit::setVisible(const bool visible){ (*it)->setVisible(visible); } } - + // =============================== Render related ================================== const Model *Unit::getCurrentModel() const{ - return currSkill->getAnimation(); + return currSkill->getAnimation(); } Vec3f Unit::getCurrVector() const{ @@ -399,11 +416,11 @@ Vec3f Unit::getCurrVectorFlat() const{ float y1= computeHeight(lastPos); float y2= computeHeight(pos); - + if(currSkill->getClass()==scMove){ v.x= lastPos.x + progress * (pos.x-lastPos.x); v.z= lastPos.y + progress * (pos.y-lastPos.y); - v.y= y1+progress*(y2-y1); + v.y= y1+progress*(y2-y1); } else{ v.x= static_cast(pos.x); @@ -421,7 +438,7 @@ Vec3f Unit::getCurrVectorFlat() const{ //any command bool Unit::anyCommand() const{ return !commands.empty(); -} +} //return current command, assert that there is always one command Command *Unit::getCurrCommand() const{ @@ -435,7 +452,9 @@ unsigned int Unit::getCommandSize() const{ //give one command (clear, and push back) CommandResult Unit::giveCommand(Command *command){ - + + //if(Socket::enableDebugText) printf("In [%s::%s] START\n",__FILE__,__FUNCTION__); + if(command->getCommandType()->isQueuable()){ //cancel current command if it is not queuable if(!commands.empty() && !commands.front()->getCommandType()->isQueuable()){ @@ -447,13 +466,17 @@ CommandResult Unit::giveCommand(Command *command){ clearCommands(); unitPath.clear(); } - + + //if(Socket::enableDebugText) printf("In [%s::%s] A\n",__FILE__,__FUNCTION__); + //check command CommandResult result= checkCommand(command); if(result==crSuccess){ applyCommand(command); } + //if(Socket::enableDebugText) printf("In [%s::%s] B\n",__FILE__,__FUNCTION__); + //push back command if(result== crSuccess){ commands.push_back(command); @@ -462,8 +485,10 @@ CommandResult Unit::giveCommand(Command *command){ delete command; } + //if(Socket::enableDebugText) printf("In [%s::%s] END\n",__FILE__,__FUNCTION__); + return result; -} +} //pop front (used when order is done) CommandResult Unit::finishCommand(){ @@ -483,7 +508,7 @@ CommandResult Unit::finishCommand(){ //to cancel a command CommandResult Unit::cancelCommand(){ - + //is empty? if(commands.empty()){ return crFailUndefined; @@ -514,13 +539,13 @@ void Unit::create(bool startingUnit){ void Unit::born(){ faction->addStore(type); - faction->applyStaticProduction(type); + faction->applyStaticProduction(type); setCurrSkill(scStop); hp= type->getMaxHp(); } void Unit::kill(){ - + //no longer needs static resources if(isBeingBuilt()){ faction->deApplyStaticConsumption(type); @@ -576,7 +601,7 @@ const CommandType *Unit::computeCommandType(const Vec2i &pos, const Unit *target //attack enemies if(!isAlly(targetUnit)){ commandType= type->getFirstAttackCommand(targetUnit->getCurrField()); - } + } //repair allies else{ @@ -609,12 +634,12 @@ bool Unit::update(){ //speed int speed= currSkill->getTotalSpeed(&totalUpgrade); - + //speed modifier float diagonalFactor= 1.f; float heightFactor= 1.f; if(currSkill->getClass()==scMove){ - + //if moving in diagonal move slower Vec2i dest= pos-lastPos; if(abs(dest.x)+abs(dest.y) == 2){ @@ -625,7 +650,7 @@ bool Unit::update(){ float heightDiff= map->getCell(pos)->getHeight() - map->getCell(targetPos)->getHeight(); heightFactor= clamp(1.f+heightDiff/5.f, 0.2f, 5.f); } - + //update progresses lastAnimProgress= animProgress; @@ -668,7 +693,7 @@ bool Unit::update(){ } //checks - if(progress>=1.f){ + if(progress>=1.f){ lastRotation= targetRotation; if(currSkill->getClass()!=scDie){ progress= 0.f; @@ -678,7 +703,7 @@ bool Unit::update(){ progress= 1.f; deadCount++; if(deadCount>=maxDeadCount){ - toBeUndertaken= true; + toBeUndertaken= true; return false; } } @@ -713,23 +738,23 @@ int Unit::update2(){ } bool Unit::computeEp(){ - + //if not enough ep - if(ep-currSkill->getEpCost() < 0){ + if(ep-currSkill->getEpCost() < 0){ return true; } //decrease ep ep-= currSkill->getEpCost(); if(ep>getType()->getTotalMaxEp(&totalUpgrade)){ - ep= getType()->getTotalMaxEp(&totalUpgrade); + ep= getType()->getTotalMaxEp(&totalUpgrade); } return false; } bool Unit::repair(){ - + //increase hp hp+= getType()->getMaxHp()/type->getProductionTime() + 1; if(hp>(getType()->getTotalMaxHp(&totalUpgrade))){ @@ -749,7 +774,7 @@ bool Unit::decHp(int i){ if(hp==0){ return false; } - + hp-=i; //startDamageParticles @@ -886,7 +911,7 @@ bool Unit::morph(const MorphCommandType *mct){ currField=morphUnitField; computeTotalUpgrade(); map->putUnitCells(this, pos); - faction->applyDiscount(morphUnitType, mct->getDiscount()); + faction->applyDiscount(morphUnitType, mct->getDiscount()); return true; } else{ @@ -899,7 +924,7 @@ bool Unit::morph(const MorphCommandType *mct){ float Unit::computeHeight(const Vec2i &pos) const{ float height= map->getCell(pos)->getHeight(); - + if(currField==fAir){ height+= World::airHeight; } @@ -931,7 +956,7 @@ void Unit::clearCommands(){ } CommandResult Unit::checkCommand(Command *command) const{ - + //if not operative or has not command type => fail if(!isOperative() || command->getUnit()==this || !getType()->hasCommandType(command->getCommandType())){ return crFailUndefined; @@ -966,13 +991,13 @@ CommandResult Unit::checkCommand(Command *command) const{ //upgrade command specific, check that upgrade is not upgraded else if(command->getCommandType()->getClass()==ccUpgrade){ - const UpgradeCommandType *uct= static_cast(command->getCommandType()); + const UpgradeCommandType *uct= static_cast(command->getCommandType()); if(faction->getUpgradeManager()->isUpgradingOrUpgraded(uct->getProducedUpgrade())){ return crFailUndefined; } } - return crSuccess; + return crSuccess; } void Unit::applyCommand(Command *command){ @@ -990,7 +1015,7 @@ void Unit::applyCommand(Command *command){ //upgrade command specific else if(command->getCommandType()->getClass()==ccUpgrade){ - const UpgradeCommandType *uct= static_cast(command->getCommandType()); + const UpgradeCommandType *uct= static_cast(command->getCommandType()); faction->startUpgrade(uct->getProducedUpgrade()); } } @@ -1003,7 +1028,7 @@ CommandResult Unit::undoCommand(Command *command){ faction->deApplyCosts(produced); } - //return building cost if not already building it or dead + //return building cost if not already building it or dead if(command->getCommandType()->getClass() == ccBuild){ if(currSkill->getClass()!=scBuild && currSkill->getClass()!=scDie){ faction->deApplyCosts(command->getUnitType()); @@ -1034,7 +1059,7 @@ void Unit::stopDamageParticles(){ void Unit::startDamageParticles(){ //start additional particles - if( showUnitParticles && (!type->damageParticleSystemTypes.empty()) + if( showUnitParticles && (!type->damageParticleSystemTypes.empty()) && (damageParticleSystems.empty()) ){ for(UnitParticleSystemTypes::const_iterator it= type->damageParticleSystemTypes.begin(); it!=type->damageParticleSystemTypes.end(); ++it){ UnitParticleSystem *ups; @@ -1077,9 +1102,77 @@ void Unit::startDamageParticles(){ damageParticleSystems.push_back(ups); Renderer::getInstance().manageParticleSystem(ups, rsGame); } - + } } +bool Unit::getCellMapCell(int x, int y) const { + const UnitType *ut= getType(); + if(ut != NULL && rotateAmount > 0) { + return cellMap[ut->getSize() * y + x]; + } + else { + return ut->getCellMapCell(x,y); + } +} + +void Unit::setRotateAmount(float value) { + rotateAmount = value; + + if(Socket::enableDebugText) printf("In [%s::%s] unit id = %d [%s] rotate amount = %f\n",__FILE__,__FUNCTION__,getId(), getFullName().c_str(),rotateAmount); + + const UnitType *ut= getType(); + if(ut != NULL && ut->hasCellMap() == true) { + int matrixSize = ut->getSize(); + + if(rotateAmount > 0) { + + delete [] cellMap; + cellMap = new bool[matrixSize * matrixSize]; + + for(int iRow = 0; iRow < matrixSize; ++iRow) { + for(int iCol = 0; iCol < matrixSize; ++iCol) { + bool getCellResult = ut->getCellMapCell(iCol, iRow); + if(Socket::enableDebugText) printf("In [%s::%s] [%d,%d] = %d\n",__FILE__,__FUNCTION__,iRow,iCol,getCellResult); + + int newRow = 0; + int newCol = 0; + + switch((int)rotateAmount) + { + case 90: + newRow = (matrixSize - iCol - 1); + newCol = iRow; + break; + case 180: + newRow = (matrixSize - iRow - 1); + newCol = (matrixSize - iCol - 1); + break; + case 270: + newRow = iCol; + newCol = (matrixSize - iRow - 1); + break; + + } + + if(Socket::enableDebugText) printf("In [%s::%s] ABOUT TO Transform to [%d,%d] = %d\n",__FILE__,__FUNCTION__,newRow,newCol,getCellResult); + + // bool getCellMapCell(int x, int y) const {return cellMap[size*y+x];} + // cellMap[i*size+j]= row[j]=='0'? false: true; + cellMap[matrixSize * newRow + newCol] = getCellResult; + } + } + } + + if(Socket::enableDebugText) printf("In [%s::%s] Transformed matrix below:\n",__FILE__,__FUNCTION__); + for(int iRow = 0; iRow < matrixSize; ++iRow) { + for(int iCol = 0; iCol < matrixSize; ++iCol) { + bool getCellResult = ut->getCellMapCell(iCol, iRow); + bool getCellResultRotated = getCellMapCell(iRow, iCol); + if(Socket::enableDebugText) printf("In [%s::%s] matrix [%d,%d] = %d, rotated = %d\n",__FILE__,__FUNCTION__,iRow,iCol,getCellResult,getCellResultRotated); + } + } + } +} }}//end namespace diff --git a/source/glest_game/type_instances/unit.h b/source/glest_game/type_instances/unit.h index 8d84981c2..08aa2bb3c 100644 --- a/source/glest_game/type_instances/unit.h +++ b/source/glest_game/type_instances/unit.h @@ -3,9 +3,9 @@ // // Copyright (C) 2001-2008 Marti�o Figueroa // -// You can redistribute this code 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 +// You can redistribute this code 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 // ============================================================== @@ -73,7 +73,7 @@ public: }; // ===================================================== -// class UnitReference +// class UnitReference // ===================================================== class UnitReference{ @@ -89,7 +89,7 @@ public: }; // ===================================================== -// class UnitPath +// class UnitPath // /// Holds the next cells of a Unit movement // ===================================================== @@ -122,7 +122,7 @@ class Unit{ private: typedef list Commands; typedef list Observers; - typedef list UnitParticleSystems; + typedef list UnitParticleSystems; public: static const float speedDivider; @@ -141,7 +141,7 @@ private: float lastAnimProgress; //between 0 and 1 float animProgress; //between 0 and 1 float highlight; - int progress2; + int progress2; int kills; UnitReference targetRef; @@ -152,18 +152,18 @@ private: Vec2i pos; Vec2i lastPos; - Vec2i targetPos; //absolute target pos + Vec2i targetPos; //absolute target pos Vec3f targetVec; Vec2i meetingPos; float lastRotation; //in degrees - float targetRotation; - float rotation; + float targetRotation; + float rotation; const UnitType *type; const ResourceType *loadType; const SkillType *currSkill; - + bool toBeUndertaken; bool alive; bool showUnitParticles; @@ -179,9 +179,12 @@ private: Observers observers; UnitParticleSystems unitParticleSystems; UnitParticleSystems damageParticleSystems; + + float rotateAmount; + bool *cellMap; public: - Unit(int id, const Vec2i &pos, const UnitType *type, Faction *faction, Map *map); + Unit(int id, const Vec2i &pos, const UnitType *type, Faction *faction, Map *map, float unitPlacementRotation); ~Unit(); //queries @@ -200,7 +203,7 @@ public: int getProductionPercent() const; float getHpRatio() const; float getEpRatio() const; - bool getToBeUndertaken() const {return toBeUndertaken;} + bool getToBeUndertaken() const {return toBeUndertaken;} Vec2i getTargetPos() const {return targetPos;} Vec3f getTargetVec() const {return targetVec;} Field getTargetField() const {return targetField;} @@ -247,8 +250,8 @@ public: void setLoadType(const ResourceType *loadType) {this->loadType= loadType;} void setProgress2(int progress2) {this->progress2= progress2;} void setPos(const Vec2i &pos); - void setTargetPos(const Vec2i &targetPos); - void setTarget(const Unit *unit); + void setTargetPos(const Vec2i &targetPos); + void setTarget(const Unit *unit); void setTargetVec(const Vec3f &targetVec) {this->targetVec= targetVec;} void setMeetingPos(const Vec2i &meetingPos) {this->meetingPos= meetingPos;} void setVisible(const bool visible); @@ -257,12 +260,12 @@ public: const Model *getCurrentModel() const; Vec3f getCurrVector() const; Vec3f getCurrVectorFlat() const; - + //command related bool anyCommand() const; Command *getCurrCommand() const; unsigned int getCommandSize() const; - CommandResult giveCommand(Command *command); //give a command + CommandResult giveCommand(Command *command); //give a command CommandResult finishCommand(); //command finished CommandResult cancelCommand(); //cancel canceled @@ -293,6 +296,10 @@ public: bool morph(const MorphCommandType *mct); CommandResult checkCommand(Command *command) const; void applyCommand(Command *command); + + void setRotateAmount(float value); + float getRotateAmount() { return rotateAmount; } + bool getCellMapCell(int x, int y) const; private: float computeHeight(const Vec2i &pos) const; diff --git a/source/glest_game/types/command_type.cpp b/source/glest_game/types/command_type.cpp index 771ba78a2..5267daa7c 100644 --- a/source/glest_game/types/command_type.cpp +++ b/source/glest_game/types/command_type.cpp @@ -3,9 +3,9 @@ // // Copyright (C) 2001-2008 Martiño Figueroa // -// You can redistribute this code 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 +// You can redistribute this code 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 // ============================================================== @@ -84,7 +84,7 @@ void StopCommandType::update(UnitUpdater *unitUpdater, Unit *unit) const{ string StopCommandType::getDesc(const TotalUpgrade *totalUpgrade) const{ string str; Lang &lang= Lang::getInstance(); - + str= name+"\n"; str+= lang.get("ReactionSpeed")+": "+ intToStr(stopSkillType->getSpeed())+"\n"; if(stopSkillType->getEpCost()!=0) @@ -132,7 +132,7 @@ void MoveCommandType::load(int id, const XmlNode *n, const string &dir, const Te string MoveCommandType::getDesc(const TotalUpgrade *totalUpgrade) const{ string str; Lang &lang= Lang::getInstance(); - + str= name+"\n"; str+= lang.get("WalkSpeed")+": "+ intToStr(moveSkillType->getSpeed()); if(totalUpgrade->getMoveSpeed()!=0){ @@ -142,7 +142,7 @@ string MoveCommandType::getDesc(const TotalUpgrade *totalUpgrade) const{ if(moveSkillType->getEpCost()!=0){ str+= lang.get("EpCost")+": "+intToStr(moveSkillType->getEpCost())+"\n"; } - + return str; } @@ -167,7 +167,7 @@ void AttackCommandType::update(UnitUpdater *unitUpdater, Unit *unit) const{ void AttackCommandType::load(int id, const XmlNode *n, const string &dir, const TechTree *tt, const FactionType *ft, const UnitType &ut){ CommandType::load(id, n, dir, tt, ft, ut); - + //move string skillName= n->getChild("move-skill")->getAttribute("value")->getRestrictedValue(); moveSkillType= static_cast(ut.getSkillType(skillName, scMove)); @@ -180,7 +180,7 @@ void AttackCommandType::load(int id, const XmlNode *n, const string &dir, const string AttackCommandType::getDesc(const TotalUpgrade *totalUpgrade) const{ string str; Lang &lang= Lang::getInstance(); - + str= name+"\n"; if(attackSkillType->getEpCost()!=0){ str+= lang.get("EpCost") + ": " + intToStr(attackSkillType->getEpCost()) + "\n"; @@ -188,9 +188,9 @@ string AttackCommandType::getDesc(const TotalUpgrade *totalUpgrade) const{ //attack strength str+= lang.get("AttackStrenght")+": "; - str+= intToStr(attackSkillType->getAttackStrength()-attackSkillType->getAttackVar()); + str+= intToStr(attackSkillType->getAttackStrength()-attackSkillType->getAttackVar()); str+= "..."; - str+= intToStr(attackSkillType->getAttackStrength()+attackSkillType->getAttackVar()); + str+= intToStr(attackSkillType->getAttackStrength()+attackSkillType->getAttackVar()); if(totalUpgrade->getAttackStrength()!=0){ str+= "+"+intToStr(totalUpgrade->getAttackStrength()); } @@ -226,7 +226,7 @@ string AttackCommandType::getDesc(const TotalUpgrade *totalUpgrade) const{ str+= "+"+intToStr(totalUpgrade->getMoveSpeed()); } str+="\n"; - + str+= lang.get("AttackSpeed")+": "+ intToStr(attackSkillType->getSpeed()) +"\n"; return str; @@ -272,12 +272,12 @@ string AttackStoppedCommandType::getDesc(const TotalUpgrade *totalUpgrade) const if(attackSkillType->getEpCost()!=0){ str+= lang.get("EpCost")+": "+intToStr(attackSkillType->getEpCost())+"\n"; } - + //attack strength str+= lang.get("AttackStrenght")+": "; - str+= intToStr(attackSkillType->getAttackStrength()-attackSkillType->getAttackVar()); + str+= intToStr(attackSkillType->getAttackStrength()-attackSkillType->getAttackVar()); str+="..."; - str+= intToStr(attackSkillType->getAttackStrength()+attackSkillType->getAttackVar()); + str+= intToStr(attackSkillType->getAttackStrength()+attackSkillType->getAttackVar()); if(totalUpgrade->getAttackStrength()!=0) str+= "+"+intToStr(totalUpgrade->getAttackStrength()); str+= " ("+ attackSkillType->getAttackType()->getName() +")"; @@ -349,7 +349,7 @@ void BuildCommandType::load(int id, const XmlNode *n, const string &dir, const T const XmlNode *buildingsNode= n->getChild("buildings"); for(int i=0; igetChildCount(); ++i){ const XmlNode *buildingNode= buildingsNode->getChild("building", i); - string name= buildingNode->getAttribute("name")->getRestrictedValue(); + string name= buildingNode->getAttribute("name")->getRestrictedValue(); buildings.push_back(ft->getUnitType(name)); } @@ -383,13 +383,13 @@ void BuildCommandType::load(int id, const XmlNode *n, const string &dir, const T string BuildCommandType::getDesc(const TotalUpgrade *totalUpgrade) const{ string str; Lang &lang= Lang::getInstance(); - + str= name+"\n"; str+= lang.get("BuildSpeed")+": "+ intToStr(buildSkillType->getSpeed())+"\n"; if(buildSkillType->getEpCost()!=0){ str+= lang.get("EpCost")+": "+intToStr(buildSkillType->getEpCost())+"\n"; } - + return str; } @@ -413,9 +413,9 @@ void HarvestCommandType::update(UnitUpdater *unitUpdater, Unit *unit) const{ } void HarvestCommandType::load(int id, const XmlNode *n, const string &dir, const TechTree *tt, const FactionType *ft, const UnitType &ut){ - + CommandType::load(id, n, dir, tt, ft, ut); - + //move string skillName= n->getChild("move-skill")->getAttribute("value")->getRestrictedValue(); moveSkillType= static_cast(ut.getSkillType(skillName, scMove)); @@ -444,7 +444,7 @@ void HarvestCommandType::load(int id, const XmlNode *n, const string &dir, const } string HarvestCommandType::getDesc(const TotalUpgrade *totalUpgrade) const{ - + Lang &lang= Lang::getInstance(); string str; @@ -490,7 +490,7 @@ void RepairCommandType::update(UnitUpdater *unitUpdater, Unit *unit) const{ } void RepairCommandType::load(int id, const XmlNode *n, const string &dir, const TechTree *tt, const FactionType *ft, const UnitType &ut){ - + CommandType::load(id, n, dir, tt, ft, ut); //move @@ -518,7 +518,7 @@ string RepairCommandType::getDesc(const TotalUpgrade *totalUpgrade) const{ if(repairSkillType->getEpCost()!=0){ str+= lang.get("EpCost")+": "+intToStr(repairSkillType->getEpCost())+"\n"; } - + str+="\n"+lang.get("CanRepair")+":\n"; for(int i=0; i(repairableUnits[i]))->getName()+"\n"; @@ -563,14 +563,14 @@ void ProduceCommandType::load(int id, const XmlNode *n, const string &dir, const string skillName= n->getChild("produce-skill")->getAttribute("value")->getRestrictedValue(); produceSkillType= static_cast(ut.getSkillType(skillName, scProduce)); - string producedUnitName= n->getChild("produced-unit")->getAttribute("name")->getRestrictedValue(); + string producedUnitName= n->getChild("produced-unit")->getAttribute("name")->getRestrictedValue(); producedUnit= ft->getUnitType(producedUnitName); } string ProduceCommandType::getDesc(const TotalUpgrade *totalUpgrade) const{ string str= name+"\n"; Lang &lang= Lang::getInstance(); - + //prod speed str+= lang.get("ProductionSpeed")+": "+ intToStr(produceSkillType->getSpeed()); if(totalUpgrade->getProdSpeed()!=0){ @@ -582,7 +582,7 @@ string ProduceCommandType::getDesc(const TotalUpgrade *totalUpgrade) const{ if(produceSkillType->getEpCost()!=0){ str+= lang.get("EpCost")+": "+intToStr(produceSkillType->getEpCost())+"\n"; } - + str+= "\n" + getProducedUnit()->getReqDesc(); return str; @@ -616,16 +616,16 @@ void UpgradeCommandType::update(UnitUpdater *unitUpdater, Unit *unit) const{ } void UpgradeCommandType::load(int id, const XmlNode *n, const string &dir, const TechTree *tt, const FactionType *ft, const UnitType &ut){ - + CommandType::load(id, n, dir, tt, ft, ut); //upgrade string skillName= n->getChild("upgrade-skill")->getAttribute("value")->getRestrictedValue(); upgradeSkillType= static_cast(ut.getSkillType(skillName, scUpgrade)); - string producedUpgradeName= n->getChild("produced-upgrade")->getAttribute("name")->getRestrictedValue(); + string producedUpgradeName= n->getChild("produced-upgrade")->getAttribute("name")->getRestrictedValue(); producedUpgrade= ft->getUpgradeType(producedUpgradeName); - + } string UpgradeCommandType::getDesc(const TotalUpgrade *totalUpgrade) const{ @@ -636,7 +636,7 @@ string UpgradeCommandType::getDesc(const TotalUpgrade *totalUpgrade) const{ str+= lang.get("UpgradeSpeed")+": "+ intToStr(upgradeSkillType->getSpeed())+"\n"; if(upgradeSkillType->getEpCost()!=0) str+= lang.get("EpCost")+": "+intToStr(upgradeSkillType->getEpCost())+"\n"; - + str+= "\n"+getProducedUpgrade()->getReqDesc(); return str; @@ -677,17 +677,17 @@ void MorphCommandType::load(int id, const XmlNode *n, const string &dir, const T morphSkillType= static_cast(ut.getSkillType(skillName, scMorph)); //morph unit - string morphUnitName= n->getChild("morph-unit")->getAttribute("name")->getRestrictedValue(); + string morphUnitName= n->getChild("morph-unit")->getAttribute("name")->getRestrictedValue(); morphUnit= ft->getUnitType(morphUnitName); //discount - discount= n->getChild("discount")->getAttribute("value")->getIntValue(); + discount= n->getChild("discount")->getAttribute("value")->getIntValue(); } string MorphCommandType::getDesc(const TotalUpgrade *totalUpgrade) const{ string str= name+"\n"; Lang &lang= Lang::getInstance(); - + //prod speed str+= lang.get("MorphSpeed")+": "+ intToStr(morphSkillType->getSpeed())+"\n"; @@ -700,7 +700,7 @@ string MorphCommandType::getDesc(const TotalUpgrade *totalUpgrade) const{ if(discount!=0){ str+= lang.get("Discount")+": "+intToStr(discount)+"%\n"; } - + str+= "\n"+getProduced()->getReqDesc(); return str; @@ -719,6 +719,45 @@ const ProducibleType *MorphCommandType::getProduced() const{ return morphUnit; } +// ===================================================== +// class RotateUnitCommandType +// ===================================================== + +//varios +RotateUnitCommandType::RotateUnitCommandType(){ + commandTypeClass= ccRotateUnit; + clicks= cOne; +} + +void RotateUnitCommandType::update(UnitUpdater *unitUpdater, Unit *unit) const{ + unitUpdater->updateStop(unit); +} + +string RotateUnitCommandType::getDesc(const TotalUpgrade *totalUpgrade) const{ + string str; + Lang &lang= Lang::getInstance(); + + str= name+"\n"; + //str+= lang.get("ReactionSpeed")+": "+ intToStr(stopSkillType->getSpeed())+"\n"; + //if(stopSkillType->getEpCost()!=0) + // str+= lang.get("EpCost")+": "+intToStr(stopSkillType->getEpCost())+"\n"; + + return str; +} + +string RotateUnitCommandType::toString() const{ + Lang &lang= Lang::getInstance(); + return lang.get("RotateUnit"); +} + +void RotateUnitCommandType::load(int id, const XmlNode *n, const string &dir, const TechTree *tt, const FactionType *ft, const UnitType &ut){ + CommandType::load(id, n, dir, tt, ft, ut); + + //stop + //string skillName= n->getChild("stop-skill")->getAttribute("value")->getRestrictedValue(); + //stopSkillType= static_cast(ut.getSkillType(skillName, scStop)); +} + // ===================================================== // class CommandFactory // ===================================================== @@ -734,6 +773,7 @@ CommandTypeFactory::CommandTypeFactory(){ registerClass("produce"); registerClass("upgrade"); registerClass("morph"); + registerClass("rotate_unit"); } CommandTypeFactory &CommandTypeFactory::getInstance(){ diff --git a/source/glest_game/types/command_type.h b/source/glest_game/types/command_type.h index 16fefe6e2..5123b9701 100644 --- a/source/glest_game/types/command_type.h +++ b/source/glest_game/types/command_type.h @@ -3,9 +3,9 @@ // // Copyright (C) 2001-2008 Martiño Figueroa // -// You can redistribute this code 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 +// You can redistribute this code 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 // ============================================================== @@ -41,6 +41,7 @@ enum CommandClass{ ccProduce, ccUpgrade, ccMorph, + ccRotateUnit, ccCount, ccNull @@ -75,13 +76,13 @@ public: virtual bool isQueuable() const {return false;} //get - CommandClass getClass() const; - Clicks getClicks() const {return clicks;} - int getId() const {return id;} + CommandClass getClass() const; + Clicks getClicks() const {return clicks;} + int getId() const {return id;} }; // =============================== -// class StopCommandType +// class StopCommandType // =============================== class StopCommandType: public CommandType{ @@ -101,7 +102,7 @@ public: // =============================== -// class MoveCommandType +// class MoveCommandType // =============================== class MoveCommandType: public CommandType{ @@ -121,7 +122,7 @@ public: // =============================== -// class AttackCommandType +// class AttackCommandType // =============================== class AttackCommandType: public CommandType{ @@ -142,7 +143,7 @@ public: }; // ======================================= -// class AttackStoppedCommandType +// class AttackStoppedCommandType // ======================================= class AttackStoppedCommandType: public CommandType{ @@ -164,7 +165,7 @@ public: // =============================== -// class BuildCommandType +// class BuildCommandType // =============================== class BuildCommandType: public CommandType{ @@ -194,7 +195,7 @@ public: // =============================== -// class HarvestCommandType +// class HarvestCommandType // =============================== class HarvestCommandType: public CommandType{ @@ -228,7 +229,7 @@ public: // =============================== -// class RepairCommandType +// class RepairCommandType // =============================== class RepairCommandType: public CommandType{ @@ -253,7 +254,7 @@ public: // =============================== -// class ProduceCommandType +// class ProduceCommandType // =============================== class ProduceCommandType: public CommandType{ @@ -278,7 +279,7 @@ public: // =============================== -// class UpgradeCommandType +// class UpgradeCommandType // =============================== class UpgradeCommandType: public CommandType{ @@ -302,7 +303,7 @@ public: }; // =============================== -// class MorphCommandType +// class MorphCommandType // =============================== class MorphCommandType: public CommandType{ @@ -327,7 +328,30 @@ public: }; // =============================== -// class CommandFactory +// class BuildCommandType +// =============================== + +class RotateUnitCommandType: public CommandType{ +private: + float rotateAmount; + +public: + RotateUnitCommandType(); + + virtual void update(UnitUpdater *unitUpdater, Unit *unit) const; + virtual void load(int id, const XmlNode *n, const string &dir, const TechTree *tt, const FactionType *ft, const UnitType &ut); + virtual string getDesc(const TotalUpgrade *totalUpgrade) const; + virtual string toString() const; + virtual bool isQueuable() const {return true;} + + //get + const float getRotateAmount() const {return rotateAmount; } + void setRotateAmount(float value) { rotateAmount = value; } +}; + + +// =============================== +// class CommandFactory // =============================== class CommandTypeFactory: public MultiFactory{ diff --git a/source/glest_game/types/skill_type.cpp b/source/glest_game/types/skill_type.cpp old mode 100644 new mode 100755 diff --git a/source/glest_game/types/skill_type.h b/source/glest_game/types/skill_type.h old mode 100644 new mode 100755 diff --git a/source/glest_game/types/unit_type.cpp b/source/glest_game/types/unit_type.cpp index c8db23015..2853fa98f 100644 --- a/source/glest_game/types/unit_type.cpp +++ b/source/glest_game/types/unit_type.cpp @@ -3,9 +3,9 @@ // // Copyright (C) 2001-2008 Marti�o Figueroa // -// You can redistribute this code 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 +// You can redistribute this code 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 // ============================================================== @@ -25,6 +25,7 @@ #include "game_util.h" #include "leak_dumper.h" #include "unit_particle_type.h" +#include "socket.h" using namespace Shared::Xml; using namespace Shared::Graphics; @@ -33,7 +34,7 @@ using namespace Shared::Util; namespace Glest{ namespace Game{ // =============================== -// class Level +// class Level // =============================== void Level::init(string name, int kills){ @@ -45,11 +46,11 @@ void Level::init(string name, int kills){ // class UnitType // ===================================================== -// ===================== PUBLIC ======================== +// ===================== PUBLIC ======================== const char *UnitType::propertyNames[]= {"burnable", "rotated_climb"}; -// ==================== creation and loading ==================== +// ==================== creation and loading ==================== UnitType::UnitType(){ @@ -69,7 +70,7 @@ UnitType::UnitType(){ cellMap= NULL; hpRegeneration= 0; epRegeneration= 0; -} +} UnitType::~UnitType(){ deleteValues(commandTypes.begin(), commandTypes.end()); @@ -82,7 +83,7 @@ UnitType::~UnitType(){ delete damageParticleSystemTypes.back(); damageParticleSystemTypes.pop_back(); } - + } void UnitType::preLoad(const string &dir){ @@ -90,7 +91,7 @@ void UnitType::preLoad(const string &dir){ } void UnitType::load(int id,const string &dir, const TechTree *techTree, const FactionType *factionType, Checksum* checksum){ - + this->id= id; string path; @@ -121,19 +122,19 @@ void UnitType::load(int id,const string &dir, const TechTree *techTree, const Fa //size size= parametersNode->getChild("size")->getAttribute("value")->getIntValue(); - + //height height= parametersNode->getChild("height")->getAttribute("value")->getIntValue(); - + //maxHp maxHp= parametersNode->getChild("max-hp")->getAttribute("value")->getIntValue(); - + //hpRegeneration hpRegeneration= parametersNode->getChild("max-hp")->getAttribute("regeneration")->getIntValue(); - + //maxEp maxEp= parametersNode->getChild("max-ep")->getAttribute("value")->getIntValue(); - + if(maxEp!=0){ //wpRegeneration epRegeneration= parametersNode->getChild("max-ep")->getAttribute("regeneration")->getIntValue(); @@ -141,14 +142,14 @@ void UnitType::load(int id,const string &dir, const TechTree *techTree, const Fa //armor armor= parametersNode->getChild("armor")->getAttribute("value")->getIntValue(); - + //armor type string string armorTypeName= parametersNode->getChild("armor-type")->getAttribute("value")->getRestrictedValue(); armorType= techTree->getArmorType(armorTypeName); //sight sight= parametersNode->getChild("sight")->getAttribute("value")->getIntValue(); - + //prod time productionTime= parametersNode->getChild("time")->getAttribute("value")->getIntValue(); @@ -169,7 +170,20 @@ void UnitType::load(int id,const string &dir, const TechTree *techTree, const Fa for(int j=0; jgetChild("row", iRow); + string row= rowNode->getAttribute("value")->getRestrictedValue(); + if(Socket::enableDebugText) printf("In [%s::%s] row = %s\n",__FILE__,__FUNCTION__,row.c_str()); + + for(int iCol = 0; iCol < size; ++iCol) { + bool getCellResult = getCellMapCell(iCol, iRow); + if(Socket::enableDebugText) printf("In [%s::%s] matrix [%d,%d] = %d\n",__FILE__,__FUNCTION__,iRow,iCol,getCellResult); + } + } + } //levels @@ -236,7 +250,7 @@ void UnitType::load(int id,const string &dir, const TechTree *techTree, const Fa if(light){ lightColor.x= lightNode->getAttribute("red")->getFloatValue(0.f, 1.f); lightColor.y= lightNode->getAttribute("green")->getFloatValue(0.f, 1.f); - lightColor.z= lightNode->getAttribute("blue")->getFloatValue(0.f, 1.f); + lightColor.z= lightNode->getAttribute("blue")->getFloatValue(0.f, 1.f); } //unit requirements @@ -333,7 +347,7 @@ void UnitType::load(int id,const string &dir, const TechTree *techTree, const Fa //commands const XmlNode *commandsNode= unitNode->getChild("commands"); - commandTypes.resize(commandsNode->getChildCount()); + commandTypes.resize(commandsNode->getChildCount()); for(int i=0; igetChild("command", i); const XmlNode *typeNode= commandNode->getChild("type"); @@ -342,7 +356,7 @@ void UnitType::load(int id,const string &dir, const TechTree *techTree, const Fa commandType->load(i, commandNode, dir, techTree, factionType, *this); commandTypes[i]= commandType; } - + computeFirstStOfClass(); computeFirstCtOfClass(); @@ -352,7 +366,7 @@ void UnitType::load(int id,const string &dir, const TechTree *techTree, const Fa if(getFirstStOfClass(scDie)==NULL){ throw runtime_error("Every unit must have at least one die skill: "+ path); } - + } //Exception handling (conversions and so on); catch(const exception &e){ @@ -360,7 +374,7 @@ void UnitType::load(int id,const string &dir, const TechTree *techTree, const Fa } } -// ==================== get ==================== +// ==================== get ==================== const CommandType *UnitType::getFirstCtOfClass(CommandClass commandClass) const{ return firstCommandTypeOfClass[commandClass]; @@ -412,7 +426,7 @@ int UnitType::getStore(const ResourceType *rt) const{ return storedResources[i].getAmount(); } } - return 0; + return 0; } const SkillType *UnitType::getSkillType(const string &skillName, SkillClass skillClass) const{ @@ -429,7 +443,7 @@ const SkillType *UnitType::getSkillType(const string &skillName, SkillClass skil throw runtime_error("No skill named \""+skillName+"\""); } -// ==================== totals ==================== +// ==================== totals ==================== int UnitType::getTotalMaxHp(const TotalUpgrade *totalUpgrade) const{ return maxHp + totalUpgrade->getMaxHp(); @@ -447,10 +461,10 @@ int UnitType::getTotalSight(const TotalUpgrade *totalUpgrade) const{ return sight + totalUpgrade->getSight(); } -// ==================== has ==================== +// ==================== has ==================== bool UnitType::hasSkillClass(SkillClass skillClass) const{ - return firstSkillTypeOfClass[skillClass]!=NULL; + return firstSkillTypeOfClass[skillClass]!=NULL; } bool UnitType::hasCommandType(const CommandType *commandType) const{ @@ -474,7 +488,7 @@ bool UnitType::hasSkillType(const SkillType *skillType) const{ return true; } } - return false; + return false; } bool UnitType::isOfClass(UnitClass uc) const{ @@ -491,14 +505,14 @@ bool UnitType::isOfClass(UnitClass uc) const{ return false; } -// ==================== PRIVATE ==================== +// ==================== PRIVATE ==================== void UnitType::computeFirstStOfClass(){ for(int j= 0; jgetClass()== SkillClass(j)){ - firstSkillTypeOfClass[j]= skillTypes[i]; + firstSkillTypeOfClass[j]= skillTypes[i]; break; } } @@ -510,7 +524,7 @@ void UnitType::computeFirstCtOfClass(){ firstCommandTypeOfClass[j]= NULL; for(int i=0; igetClass()== CommandClass(j)){ - firstCommandTypeOfClass[j]= commandTypes[i]; + firstCommandTypeOfClass[j]= commandTypes[i]; break; } } diff --git a/source/glest_game/types/unit_type.h b/source/glest_game/types/unit_type.h index bbc5dc24a..3b84b595b 100644 --- a/source/glest_game/types/unit_type.h +++ b/source/glest_game/types/unit_type.h @@ -95,6 +95,7 @@ private: int sight; int size; //size in cells int height; + float rotatedBuildPos; //cellmap bool *cellMap; @@ -181,6 +182,9 @@ public: //find const CommandType* findCommandTypeById(int id) const; + float getRotatedBuildPos() { return rotatedBuildPos; } + float setRotatedBuildPos(float value) { rotatedBuildPos = value; } + private: void computeFirstStOfClass(); void computeFirstCtOfClass(); diff --git a/source/glest_game/world/map.cpp b/source/glest_game/world/map.cpp index 3d4136ae4..4213ecf00 100644 --- a/source/glest_game/world/map.cpp +++ b/source/glest_game/world/map.cpp @@ -3,9 +3,9 @@ // // Copyright (C) 2001-2008 Martiño Figueroa // -// You can redistribute this code 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 +// You can redistribute this code 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 // ============================================================== @@ -39,10 +39,10 @@ Cell::Cell(){ height= 0; } -// ==================== misc ==================== +// ==================== misc ==================== //returns if the cell is free -bool Cell::isFree(Field field) const{ +bool Cell::isFree(Field field) const{ return getUnit(field)==NULL || getUnit(field)->isPutrefacting(); } @@ -83,7 +83,7 @@ void SurfaceCell::setVisible(int teamIndex, bool visible){ // class Map // ===================================================== -// ===================== PUBLIC ======================== +// ===================== PUBLIC ======================== const int Map::cellScale= 2; const int Map::mapScale= 2; @@ -103,7 +103,7 @@ Map::~Map(){ } void Map::load(const string &path, TechTree *techTree, Tileset *tileset){ - + struct MapFileHeader{ int32 version; int32 maxPlayers; @@ -155,14 +155,14 @@ void Map::load(const string &path, TechTree *techTree, Tileset *tileset){ //cells cells= new Cell[w*h]; surfaceCells= new SurfaceCell[surfaceW*surfaceH]; - + //read heightmap for(int j=0; jsetVertex(Vec3f(i*mapScale, alt / heightFactor, j*mapScale)); + sc->setVertex(Vec3f(i*mapScale, alt / heightFactor, j*mapScale)); } } @@ -171,14 +171,14 @@ void Map::load(const string &path, TechTree *techTree, Tileset *tileset){ for(int i=0; isetSurfaceType(surf-1); + getSurfaceCell(i, j)->setSurfaceType(surf-1); } } - + //read objects and resources for(int j=0; j=0 && y>=0 && xisFree(field) && + return + isInside(pos) && + getCell(pos)->isFree(field) && (field==fAir || getSurfaceCell(toSurfCoords(pos))->isFree()) && (field!=fLand || !getDeepSubmerged(getCell(pos))); } @@ -286,7 +286,7 @@ bool Map::isFreeCellOrHasUnit(const Vec2i &pos, Field field, const Unit *unit) c bool Map::isAproxFreeCell(const Vec2i &pos, Field field, int teamIndex) const{ - if(isInside(pos)){ + if(isInside(pos)){ const SurfaceCell *sc= getSurfaceCell(toSurfCoords(pos)); if(sc->isVisible(teamIndex)){ @@ -298,7 +298,7 @@ bool Map::isAproxFreeCell(const Vec2i &pos, Field field, int teamIndex) const{ else{ return true; } - } + } return false; } @@ -336,7 +336,7 @@ bool Map::isAproxFreeCells(const Vec2i &pos, int size, Field field, int teamInde } -// ==================== unit placement ==================== +// ==================== unit placement ==================== //checks if a unit can move from between 2 cells bool Map::canMove(const Unit *unit, const Vec2i &pos1, const Vec2i &pos2) const{ @@ -403,7 +403,7 @@ bool Map::aproxCanMove(const Unit *unit, const Vec2i &pos1, const Vec2i &pos2) c //put a units into the cells void Map::putUnitCells(Unit *unit, const Vec2i &pos){ - + assert(unit!=NULL); const UnitType *ut= unit->getType(); @@ -411,19 +411,19 @@ void Map::putUnitCells(Unit *unit, const Vec2i &pos){ for(int j=0; jgetSize(); ++j){ Vec2i currPos= pos + Vec2i(i, j); assert(isInside(currPos)); - if(!ut->hasCellMap() || ut->getCellMapCell(i, j)){ + if(!ut->hasCellMap() || unit->getCellMapCell(i, j)){ assert(getCell(currPos)->getUnit(unit->getCurrField())==NULL); getCell(currPos)->setUnit(unit->getCurrField(), unit); } - } + } } unit->setPos(pos); } //removes a unit from cells void Map::clearUnitCells(Unit *unit, const Vec2i &pos){ - + assert(unit!=NULL); const UnitType *ut= unit->getType(); @@ -431,19 +431,19 @@ void Map::clearUnitCells(Unit *unit, const Vec2i &pos){ for(int j=0; jgetSize(); ++j){ Vec2i currPos= pos + Vec2i(i, j); assert(isInside(currPos)); - if(!ut->hasCellMap() || ut->getCellMapCell(i, j)){ + if(!ut->hasCellMap() || unit->getCellMapCell(i, j)){ assert(getCell(currPos)->getUnit(unit->getCurrField())==unit); getCell(currPos)->setUnit(unit->getCurrField(), NULL); } - } + } } } -// ==================== misc ==================== +// ==================== misc ==================== //returnis if unit is next to pos bool Map::isNextTo(const Vec2i &pos, const Unit *unit) const{ - + for(int i=-1; i<=1; ++i){ for(int j=-1; j<=1; ++j){ if(isInside(pos.x+i, pos.y+j)) { @@ -477,15 +477,15 @@ void Map::prepareTerrain(const Unit *unit){ computeInterpolatedHeights(); } -// ==================== PRIVATE ==================== +// ==================== PRIVATE ==================== -// ==================== compute ==================== +// ==================== compute ==================== void Map::flatternTerrain(const Unit *unit){ float refHeight= getSurfaceCell(toSurfCoords(unit->getCenteredPos()))->getHeight(); for(int i=-1; i<=unit->getType()->getSize(); ++i){ for(int j=-1; j<=unit->getType()->getSize(); ++j){ - Vec2i pos= unit->getPos()+Vec2i(i, j); + Vec2i pos= unit->getPos()+Vec2i(i, j); Cell *c= getCell(pos); SurfaceCell *sc= getSurfaceCell(toSurfCoords(pos)); //we change height if pos is inside world, if its free or ocupied by the currenty building @@ -497,14 +497,14 @@ void Map::flatternTerrain(const Unit *unit){ } //compute normals -void Map::computeNormals(){ +void Map::computeNormals(){ //compute center normals for(int i=1; isetNormal( - getSurfaceCell(i, j)->getVertex().normal(getSurfaceCell(i, j-1)->getVertex(), - getSurfaceCell(i+1, j)->getVertex(), - getSurfaceCell(i, j+1)->getVertex(), + getSurfaceCell(i, j)->getVertex().normal(getSurfaceCell(i, j-1)->getVertex(), + getSurfaceCell(i+1, j)->getVertex(), + getSurfaceCell(i, j+1)->getVertex(), getSurfaceCell(i-1, j)->getVertex())); } } @@ -547,7 +547,7 @@ void Map::computeInterpolatedHeights(){ } } } - + void Map::smoothSurface(){ @@ -613,7 +613,7 @@ void Map::computeCellColors(){ } } -// static +// static string Map::getMapPath(const string &mapName) { string mega = "maps/" + mapName + ".mgm"; string glest = "maps/" + mapName + ".gbm"; @@ -639,9 +639,9 @@ PosCircularIterator::PosCircularIterator(const Map *map, const Vec2i ¢er, in } bool PosCircularIterator::next(){ - + //iterate while dont find a cell that is inside the world - //and at less or equal distance that the radius + //and at less or equal distance that the radius do{ pos.x++; if(pos.x > center.x+radius){ @@ -653,7 +653,7 @@ bool PosCircularIterator::next(){ } while(floor(pos.dist(center)) >= (radius+1) || !map->isInside(pos)); //while(!(pos.dist(center) <= radius && map->isInside(pos))); - + return true; } @@ -678,27 +678,27 @@ PosQuadIterator::PosQuadIterator(const Map *map, const Quad2i &quad, int step){ } bool PosQuadIterator::next(){ - + do{ pos.x+= step; if(pos.x > boundingRect.p[1].x){ - pos.x= (boundingRect.p[0].x/step)*step; + pos.x= (boundingRect.p[0].x/step)*step; pos.y+= step; } if(pos.y>boundingRect.p[1].y) return false; } while(!quad.isInside(pos)); - + return true; } void PosQuadIterator::skipX(){ pos.x+= step; -} +} const Vec2i &PosQuadIterator::getPos(){ return pos; } - + }}//end namespace diff --git a/source/glest_game/world/map.h b/source/glest_game/world/map.h old mode 100644 new mode 100755 diff --git a/source/glest_game/world/unit_updater.cpp b/source/glest_game/world/unit_updater.cpp index eb07e418a..5a1ec42d0 100644 --- a/source/glest_game/world/unit_updater.cpp +++ b/source/glest_game/world/unit_updater.cpp @@ -3,9 +3,9 @@ // // Copyright (C) 2001-2008 Marti�o Figueroa // -// You can redistribute this code 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 +// You can redistribute this code 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 // ============================================================== @@ -38,7 +38,7 @@ namespace Glest{ namespace Game{ // class UnitUpdater // ===================================================== -// ===================== PUBLIC ======================== +// ===================== PUBLIC ======================== void UnitUpdater::init(Game *game){ @@ -52,7 +52,7 @@ void UnitUpdater::init(Game *game){ } -// ==================== progress skills ==================== +// ==================== progress skills ==================== //skill dependent actions void UnitUpdater::updateUnit(Unit *unit){ @@ -106,18 +106,18 @@ void UnitUpdater::updateUnit(Unit *unit){ unit->kill(); } } - -// ==================== progress commands ==================== + +// ==================== progress commands ==================== //VERY IMPORTANT: compute next state depending on the first order of the list void UnitUpdater::updateUnitCommand(Unit *unit){ - + //if unis has command process it if(unit->anyCommand()) { unit->getCurrCommand()->getCommandType()->update(this, unit); } - + //if no commands stop and add stop command if(!unit->anyCommand() && unit->isOperative()){ unit->setCurrSkill(scStop); @@ -127,21 +127,21 @@ void UnitUpdater::updateUnitCommand(Unit *unit){ } } -// ==================== updateStop ==================== +// ==================== updateStop ==================== void UnitUpdater::updateStop(Unit *unit){ - + Command *command= unit->getCurrCommand(); const StopCommandType *sct = static_cast(command->getCommandType()); Unit *sighted; unit->setCurrSkill(sct->getStopSkillType()); - + //we can attack any unit => attack it if(unit->getType()->hasSkillClass(scAttack)){ for(int i=0; igetType()->getCommandTypeCount(); ++i){ const CommandType *ct= unit->getType()->getCommandType(i); - + //look for an attack skill const AttackSkillType *ast= NULL; if(ct->getClass()==ccAttack){ @@ -154,7 +154,7 @@ void UnitUpdater::updateStop(Unit *unit){ //use it to attack if(ast!=NULL){ if(attackableOnSight(unit, &sighted, ast)){ - unit->giveCommand(new Command(ct, sighted->getPos())); + unit->giveCommand(new Command(ct, sighted->getPos())); break; } } @@ -171,19 +171,19 @@ void UnitUpdater::updateStop(Unit *unit){ } -// ==================== updateMove ==================== +// ==================== updateMove ==================== void UnitUpdater::updateMove(Unit *unit){ - + Command *command= unit->getCurrCommand(); - const MoveCommandType *mct= static_cast(command->getCommandType()); + const MoveCommandType *mct= static_cast(command->getCommandType()); Vec2i pos= command->getUnit()!=NULL? command->getUnit()->getCenteredPos(): command->getPos(); switch(pathFinder.findPath(unit, pos)){ case PathFinder::tsOnTheWay: unit->setCurrSkill(mct->getMoveSkillType()); - break; + break; case PathFinder::tsBlocked: if(unit->getPath()->isBlocked()){ @@ -197,12 +197,12 @@ void UnitUpdater::updateMove(Unit *unit){ } -// ==================== updateAttack ==================== +// ==================== updateAttack ==================== void UnitUpdater::updateAttack(Unit *unit){ Command *command= unit->getCurrCommand(); - const AttackCommandType *act= static_cast(command->getCommandType()); + const AttackCommandType *act= static_cast(command->getCommandType()); Unit *target= NULL; //if found @@ -232,7 +232,7 @@ void UnitUpdater::updateAttack(Unit *unit){ switch (pathFinder.findPath(unit, pos)){ case PathFinder::tsOnTheWay: unit->setCurrSkill(act->getMoveSkillType()); - break; + break; case PathFinder::tsBlocked: if(unit->getPath()->isBlocked()){ unit->finishCommand(); @@ -245,12 +245,12 @@ void UnitUpdater::updateAttack(Unit *unit){ } -// ==================== updateAttackStopped ==================== +// ==================== updateAttackStopped ==================== void UnitUpdater::updateAttackStopped(Unit *unit){ - + Command *command= unit->getCurrCommand(); - const AttackStoppedCommandType *asct= static_cast(command->getCommandType()); + const AttackStoppedCommandType *asct= static_cast(command->getCommandType()); Unit *enemy; if(attackableOnRange(unit, &enemy, asct->getAttackSkillType())){ @@ -263,29 +263,32 @@ void UnitUpdater::updateAttackStopped(Unit *unit){ } -// ==================== updateBuild ==================== +// ==================== updateBuild ==================== void UnitUpdater::updateBuild(Unit *unit){ - + Command *command= unit->getCurrCommand(); - const BuildCommandType *bct= static_cast(command->getCommandType()); - + const BuildCommandType *bct= static_cast(command->getCommandType()); + if(unit->getCurrSkill()->getClass() != scBuild) { //if not building const UnitType *ut= command->getUnitType(); - + switch (pathFinder.findPath(unit, command->getPos()-Vec2i(1))){ case PathFinder::tsOnTheWay: unit->setCurrSkill(bct->getMoveSkillType()); break; - - case PathFinder::tsArrived: + + case PathFinder::tsArrived: //if arrived destination assert(command->getUnitType()!=NULL); if(map->isFreeCells(command->getPos(), ut->getSize(), fLand)){ const UnitType *builtUnitType= command->getUnitType(); - Unit *builtUnit= new Unit(world->getNextUnitId(), command->getPos(), builtUnitType, unit->getFaction(), world->getMap()); - builtUnit->create(); + + //!!! + float unitRotation = gui->getUnitTypeBuildRotation(builtUnitType->getId()); + Unit *builtUnit= new Unit(world->getNextUnitId(), command->getPos(), builtUnitType, unit->getFaction(), world->getMap(),unitRotation); + builtUnit->create(); if(!builtUnitType->hasSkillClass(scBeBuilt)){ throw runtime_error("Unit " + builtUnitType->getName() + "has no be_built skill"); @@ -296,14 +299,33 @@ void UnitUpdater::updateBuild(Unit *unit){ unit->setTarget(builtUnit); map->prepareTerrain(builtUnit); command->setUnit(builtUnit); - + //play start sound if(unit->getFactionIndex()==world->getThisFactionIndex()){ SoundRenderer::getInstance().playFx( bct->getStartSound(), - unit->getCurrVector(), + unit->getCurrVector(), gameCamera->getPos()); } + + //!!! + /* + if(unitRotation > 0) { + if(Socket::enableDebugText) printf("In [%s::%s] before sending ccRotateUnit...\n",__FILE__,__FUNCTION__); + + RotateUnitCommandType *rotateCmdType = new RotateUnitCommandType(); + rotateCmdType->setRotateAmount(unitRotation); + + Command *rotateUnitCmd = new Command(rotateCmdType); + rotateUnitCmd->setUnit(builtUnit); + + if(Socket::enableDebugText) printf("In [%s::%s] in sending ccRotateUnit...\n",__FILE__,__FUNCTION__); + + builtUnit->giveCommand(rotateUnitCmd); + + if(Socket::enableDebugText) printf("In [%s::%s] after sending ccRotateUnit...\n",__FILE__,__FUNCTION__); + } + */ } else{ //if there are no free cells @@ -325,7 +347,7 @@ void UnitUpdater::updateBuild(Unit *unit){ else{ //if building Unit *builtUnit= map->getCell(unit->getTargetPos())->getUnit(fLand); - + //if u is killed while building then u==NULL; if(builtUnit!=NULL && builtUnit!=command->getUnit()){ unit->setCurrSkill(scStop); @@ -343,10 +365,10 @@ void UnitUpdater::updateBuild(Unit *unit){ if(unit->getFactionIndex()==world->getThisFactionIndex()){ SoundRenderer::getInstance().playFx( bct->getBuiltSound(), - unit->getCurrVector(), + unit->getCurrVector(), gameCamera->getPos()); } - } + } } } @@ -354,11 +376,11 @@ void UnitUpdater::updateBuild(Unit *unit){ // ==================== updateHarvest ==================== void UnitUpdater::updateHarvest(Unit *unit){ - + Command *command= unit->getCurrCommand(); - const HarvestCommandType *hct= static_cast(command->getCommandType()); + const HarvestCommandType *hct= static_cast(command->getCommandType()); Vec2i targetPos; - + if(unit->getCurrSkill()->getClass() != scHarvest) { //if not working if(unit->getLoadCount()==0){ @@ -366,7 +388,7 @@ void UnitUpdater::updateHarvest(Unit *unit){ Resource *r= map->getSurfaceCell(Map::toSurfCoords(command->getPos()))->getResource(); if(r!=NULL && hct->canHarvest(r->getType())){ //if can harvest dest. pos - if(unit->getPos().dist(command->getPos())getPos().dist(command->getPos())isResourceNear(unit->getPos(), r->getType(), targetPos)) { //if it finds resources it starts harvesting unit->setCurrSkill(hct->getHarvestSkillType()); @@ -395,7 +417,7 @@ void UnitUpdater::updateHarvest(Unit *unit){ } else{ //if loaded, return to store - Unit *store= world->nearestStore(unit->getPos(), unit->getFaction()->getIndex(), unit->getLoadType()); + Unit *store= world->nearestStore(unit->getPos(), unit->getFaction()->getIndex(), unit->getLoadType()); if(store!=NULL){ switch(pathFinder.findPath(unit, store->getCenteredPos())){ case PathFinder::tsOnTheWay: @@ -404,10 +426,10 @@ void UnitUpdater::updateHarvest(Unit *unit){ default: break; } - + //world->changePosCells(unit,unit->getPos()+unit->getDest()); if(map->isNextTo(unit->getPos(), store)){ - + //update resources int resourceAmount= unit->getLoadCount(); if(unit->getFaction()->getCpuUltraControl()){ @@ -431,7 +453,7 @@ void UnitUpdater::updateHarvest(Unit *unit){ } } } - else{ + else{ //if working SurfaceCell *sc= map->getSurfaceCell(Map::toSurfCoords(unit->getTargetPos())); Resource *r= sc->getResource(); @@ -441,7 +463,7 @@ void UnitUpdater::updateHarvest(Unit *unit){ if(unit->getProgress2()>=hct->getHitsPerUnit()){ unit->setProgress2(0); unit->setLoadCount(unit->getLoadCount()+1); - + //if resource exausted, then delete it and stop if(r->decAmount(1)){ sc->deleteResource(); @@ -466,17 +488,17 @@ void UnitUpdater::updateHarvest(Unit *unit){ // ==================== updateRepair ==================== void UnitUpdater::updateRepair(Unit *unit){ - + Command *command= unit->getCurrCommand(); const RepairCommandType *rct= static_cast(command->getCommandType()); - + Unit *repaired= map->getCell(command->getPos())->getUnit(fLand); bool nextToRepaired= repaired!=NULL && map->isNextTo(unit->getPos(), repaired); if(unit->getCurrSkill()->getClass()!=scRepair || !nextToRepaired){ //if not repairing if(repaired!=NULL && rct->isRepairableUnitType(repaired->getType()) && repaired->isDamaged()){ - + if(nextToRepaired){ unit->setTarget(repaired); unit->setCurrSkill(rct->getRepairSkillType()); @@ -485,7 +507,7 @@ void UnitUpdater::updateRepair(Unit *unit){ switch(pathFinder.findPath(unit, command->getPos())){ case PathFinder::tsOnTheWay: unit->setCurrSkill(rct->getMoveSkillType()); - break; + break; case PathFinder::tsBlocked: if(unit->getPath()->isBlocked()){ unit->finishCommand(); @@ -521,7 +543,7 @@ void UnitUpdater::updateRepair(Unit *unit){ // ==================== updateProduce ==================== void UnitUpdater::updateProduce(Unit *unit){ - + Command *command= unit->getCurrCommand(); const ProduceCommandType *pct= static_cast(command->getCommandType()); Unit *produced; @@ -535,8 +557,11 @@ void UnitUpdater::updateProduce(Unit *unit){ if(unit->getProgress2()>pct->getProduced()->getProductionTime()){ unit->finishCommand(); unit->setCurrSkill(scStop); - produced= new Unit(world->getNextUnitId(), Vec2i(0), pct->getProducedUnit(), unit->getFaction(), world->getMap()); - + + //!!! + float unitRotation = gui->getUnitTypeBuildRotation(pct->getProducedUnit()->getId()); + produced= new Unit(world->getNextUnitId(), Vec2i(0), pct->getProducedUnit(), unit->getFaction(), world->getMap(),unitRotation); + //place unit creates the unit if(!world->placeUnit(unit->getCenteredPos(), 10, produced)){ delete produced; @@ -559,16 +584,16 @@ void UnitUpdater::updateProduce(Unit *unit){ // ==================== updateUpgrade ==================== void UnitUpdater::updateUpgrade(Unit *unit){ - + Command *command= unit->getCurrCommand(); const UpgradeCommandType *uct= static_cast(command->getCommandType()); - + if(unit->getCurrSkill()->getClass()!=scUpgrade){ //if not producing unit->setCurrSkill(uct->getUpgradeSkillType()); } else{ - //if producing + //if producing unit->update2(); if(unit->getProgress2()>uct->getProduced()->getProductionTime()){ unit->finishCommand(); @@ -581,10 +606,10 @@ void UnitUpdater::updateUpgrade(Unit *unit){ // ==================== updateMorph ==================== void UnitUpdater::updateMorph(Unit *unit){ - + Command *command= unit->getCurrCommand(); const MorphCommandType *mct= static_cast(command->getCommandType()); - + if(unit->getCurrSkill()->getClass()!=scMorph){ //if not morphing, check space if(map->isFreeCellsOrHasUnit(unit->getPos(), mct->getMorphUnit()->getSize(), unit->getCurrField(), unit)){ @@ -600,7 +625,7 @@ void UnitUpdater::updateMorph(Unit *unit){ else{ unit->update2(); if(unit->getProgress2()>mct->getProduced()->getProductionTime()){ - + //finish the command if(unit->morph(mct)){ unit->finishCommand(); @@ -616,29 +641,29 @@ void UnitUpdater::updateMorph(Unit *unit){ } } unit->setCurrSkill(scStop); - + } } } -// ==================== PRIVATE ==================== +// ==================== PRIVATE ==================== -// ==================== attack ==================== +// ==================== attack ==================== void UnitUpdater::hit(Unit *attacker){ hit(attacker, static_cast(attacker->getCurrSkill()), attacker->getTargetPos(), attacker->getTargetField()); } void UnitUpdater::hit(Unit *attacker, const AttackSkillType* ast, const Vec2i &targetPos, Field targetField){ - + //hit attack positions if(ast->getSplash()){ PosCircularIterator pci(map, targetPos, ast->getSplashRadius()); while(pci.next()){ Unit *attacked= map->getCell(pci.getPos())->getUnit(targetField); if(attacked!=NULL){ - if(ast->getSplashDamageAll() - || !attacker->isAlly(attacked) + if(ast->getSplashDamageAll() + || !attacker->isAlly(attacked) || ( targetPos.x==pci.getPos().x && targetPos.y==pci.getPos().y )){ damage(attacker, ast, attacked, pci.getPos().dist(attacker->getTargetPos())); } @@ -661,7 +686,7 @@ void UnitUpdater::damage(Unit *attacker, const AttackSkillType* ast, Unit *attac int var= ast->getAttackVar(); int armor= attacked->getType()->getTotalArmor(attacked->getTotalUpgrade()); float damageMultiplier= world->getTechTree()->getDamageMultiplier(ast->getAttackType(), attacked->getType()->getArmorType()); - + //compute damage damage+= random.randRange(-var, var); damage/= distance+1; @@ -676,19 +701,19 @@ void UnitUpdater::damage(Unit *attacker, const AttackSkillType* ast, Unit *attac world->getStats()->kill(attacker->getFactionIndex(), attacked->getFactionIndex()); attacker->incKills(); scriptManager->onUnitDied(attacked); - } + } } void UnitUpdater::startAttackParticleSystem(Unit *unit){ Renderer &renderer= Renderer::getInstance(); - + ProjectileParticleSystem *psProj = 0; SplashParticleSystem *psSplash; - + const AttackSkillType *ast= static_cast(unit->getCurrSkill()); ParticleSystemTypeProjectile *pstProj= ast->getProjParticleType(); ParticleSystemTypeSplash *pstSplash= ast->getSplashParticleType(); - + Vec3f startPos= unit->getCurrVector(); Vec3f endPos= unit->getTargetVec(); @@ -699,7 +724,7 @@ void UnitUpdater::startAttackParticleSystem(Unit *unit){ //projectile if(pstProj!=NULL){ - psProj= pstProj->create(); + psProj= pstProj->create(); psProj->setPath(startPos, endPos); psProj->setObserver(new ParticleDamager(unit, this, gameCamera)); psProj->setVisible(visible); @@ -723,12 +748,12 @@ void UnitUpdater::startAttackParticleSystem(Unit *unit){ } } -// ==================== misc ==================== +// ==================== misc ==================== //looks for a resource of type rt, if rt==NULL looks for any //resource the unit can harvest bool UnitUpdater::searchForResource(Unit *unit, const HarvestCommandType *hct){ - + Vec2i pos= unit->getCurrCommand()->getPos(); for(int radius= 0; radius enemies; //we check command target @@ -786,22 +811,22 @@ bool UnitUpdater::unitOnRange(const Unit *unit, int range, Unit **rangedPtr, con //nearby cells for(int i=center.x-range; iisInside(i, j) && floor(floatCenter.dist(Vec2f(i, j))) <= (range+1)){ - + //all fields for(int k=0; k(k); - + //check field if((ast==NULL || ast->getAttackField(f))){ Unit *possibleEnemy= map->getCell(i, j)->getUnit(f); - + //check enemy if(possibleEnemy!=NULL && possibleEnemy->isAlive()){ - if((!unit->isAlly(possibleEnemy) && commandTarget==NULL) || commandTarget==possibleEnemy){ - enemies.push_back(possibleEnemy); + if((!unit->isAlly(possibleEnemy) && commandTarget==NULL) || commandTarget==possibleEnemy){ + enemies.push_back(possibleEnemy); } } } @@ -813,7 +838,7 @@ bool UnitUpdater::unitOnRange(const Unit *unit, int range, Unit **rangedPtr, con //attack enemies that can attack first for(int i=0; igetType()->hasSkillClass(scAttack)){ - *rangedPtr= enemies[i]; + *rangedPtr= enemies[i]; return true; } } @@ -823,7 +848,7 @@ bool UnitUpdater::unitOnRange(const Unit *unit, int range, Unit **rangedPtr, con *rangedPtr= enemies.front(); return true; } - + return false; } @@ -842,11 +867,11 @@ ParticleDamager::ParticleDamager(Unit *attacker, UnitUpdater *unitUpdater, const void ParticleDamager::update(ParticleSystem *particleSystem){ Unit *attacker= attackerRef.getUnit(); - + if(attacker!=NULL){ unitUpdater->hit(attacker, ast, targetPos, targetField); - + //play sound StaticSound *projSound= ast->getProjSound(); if(particleSystem->getVisible() && projSound!=NULL){ diff --git a/source/glest_game/world/world.cpp b/source/glest_game/world/world.cpp index 02548a9ec..68618f64a 100644 --- a/source/glest_game/world/world.cpp +++ b/source/glest_game/world/world.cpp @@ -3,9 +3,9 @@ // // Copyright (C) 2001-2008 Martiño Figueroa // -// You can redistribute this code 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 +// You can redistribute this code 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 // ============================================================== @@ -14,8 +14,8 @@ #include #include -#include "config.h" -#include "faction.h" +#include "config.h" +#include "faction.h" #include "unit.h" #include "game.h" #include "logger.h" @@ -34,7 +34,7 @@ namespace Glest{ namespace Game{ const float World::airHeight= 5.f; -// ===================== PUBLIC ======================== +// ===================== PUBLIC ======================== World::World(){ Config &config= Config::getInstance(); @@ -47,6 +47,7 @@ World::World(){ nextUnitId= 0; scriptManager= NULL; + this->game = NULL; } void World::end(){ @@ -61,7 +62,8 @@ void World::end(){ // ========================== init =============================================== void World::init(Game *game, bool createUnits){ - + + this->game = game; scriptManager= game->getScriptManager(); unitUpdater.init(game); @@ -72,7 +74,7 @@ void World::init(Game *game, bool createUnits){ initSplattedTextures(); //minimap must be init after sum computation - initMinimap(); + initMinimap(); if(createUnits){ initUnits(); } @@ -103,7 +105,7 @@ void World::loadScenario(const string &path, Checksum *checksum){ scenario.load(path); } -// ==================== misc ==================== +// ==================== misc ==================== void World::update(){ @@ -150,7 +152,7 @@ void World::update(){ minimap.updateFowTex(clamp(fogFactor, 0.f, 1.f)); } - //tick + //tick if(frameCount%GameConstants::updateFps==0){ computeFow(); tick(); @@ -172,16 +174,16 @@ void World::tick(){ //compute resources balance for(int k=0; kgetClass()==rcConsumable){ int balance= 0; for(int j=0; jgetUnitCount(); ++j){ - + //if unit operative and has this cost const Unit *u= faction->getUnit(j); if(u->isOperative()){ @@ -200,10 +202,10 @@ void World::tick(){ Unit* World::findUnitById(int id){ for(int i= 0; igetUnitCount(); ++j){ Unit* unit= faction->getUnit(j); - + if(unit->getId()==id){ return unit; } @@ -215,7 +217,7 @@ Unit* World::findUnitById(int id){ const UnitType* World::findUnitTypeById(const FactionType* factionType, int id){ for(int i= 0; igetUnitTypeCount(); ++i){ const UnitType* unitType= factionType->getUnitType(i); - + if(unitType->getId()==id){ return unitType; } @@ -254,8 +256,8 @@ bool World::placeUnit(const Vec2i &startLoc, int radius, Unit *unit, bool spacia //clears a unit old position from map and places new position void World::moveUnitCells(Unit *unit){ - Vec2i newPos= unit->getTargetPos(); - + Vec2i newPos= unit->getTargetPos(); + //newPos must be free or the same pos as current assert(map.getCell(unit->getPos())->getUnit(unit->getCurrField())==unit || map.isFreeCell(newPos, unit->getCurrField())); map.clearUnitCells(unit, unit->getPos()); @@ -290,16 +292,16 @@ Unit *World::nearestStore(const Vec2i &pos, int factionIndex, const ResourceType bool World::toRenderUnit(const Unit *unit, const Quad2i &visibleQuad) const{ //a unit is rendered if it is in a visible cell or is attacking a unit in a visible cell - return + return visibleQuad.isInside(unit->getPos()) && toRenderUnit(unit); } bool World::toRenderUnit(const Unit *unit) const{ - - return - map.getSurfaceCell(Map::toSurfCoords(unit->getCenteredPos()))->isVisible(thisTeamIndex) || - (unit->getCurrSkill()->getClass()==scAttack && + + return + map.getSurfaceCell(Map::toSurfCoords(unit->getCenteredPos()))->isVisible(thisTeamIndex) || + (unit->getCurrSkill()->getClass()==scAttack && map.getSurfaceCell(Map::toSurfCoords(unit->getTargetPos()))->isVisible(thisTeamIndex)); } @@ -309,14 +311,20 @@ void World::createUnit(const string &unitName, int factionIndex, const Vec2i &po const FactionType* ft= faction->getType(); const UnitType* ut= ft->getUnitType(unitName); - Unit* unit= new Unit(getNextUnitId(), pos, ut, faction, &map); + //!!! + if(Socket::enableDebugText) printf("In [%s::%s] A\n",__FILE__,__FUNCTION__); + float unitRotation = game->getGui()->getUnitTypeBuildRotation(ut->getId()); + if(Socket::enableDebugText) printf("In [%s::%s] B\n",__FILE__,__FUNCTION__); + + Unit* unit= new Unit(getNextUnitId(), pos, ut, faction, &map, unitRotation); + if(placeUnit(pos, generationArea, unit, true)){ unit->create(true); unit->born(); scriptManager->onUnitCreated(unit); } else{ - throw runtime_error("Unit cant be placed"); + throw runtime_error("Unit cant be placed"); } } else @@ -343,7 +351,7 @@ void World::givePositionCommand(int unitId, const string &commandName, const Vec CommandClass cc; if(commandName=="move"){ - cc= ccMove; + cc= ccMove; } else if(commandName=="attack"){ cc= ccAttack; @@ -351,7 +359,7 @@ void World::givePositionCommand(int unitId, const string &commandName, const Vec else{ throw runtime_error("Invalid position commmand: " + commandName); } - + unit->giveCommand(new Command( unit->getType()->getFirstCtOfClass(cc), pos )); } } @@ -360,7 +368,7 @@ void World::giveProductionCommand(int unitId, const string &producedName){ Unit *unit= findUnitById(unitId); if(unit!=NULL){ const UnitType *ut= unit->getType(); - + //Search for a command that can produce the unit for(int i= 0; igetCommandTypeCount(); ++i){ const CommandType* ct= ut->getCommandType(i); @@ -379,7 +387,7 @@ void World::giveUpgradeCommand(int unitId, const string &upgradeName){ Unit *unit= findUnitById(unitId); if(unit!=NULL){ const UnitType *ut= unit->getType(); - + //Search for a command that can produce the unit for(int i= 0; igetCommandTypeCount(); ++i){ const CommandType* ct= ut->getCommandType(i); @@ -438,7 +446,7 @@ int World::getUnitCount(int factionIndex){ if(factionIndexgetUnitCount(); ++i){ const Unit* unit= faction->getUnit(i); if(unit->isAlive()){ @@ -457,7 +465,7 @@ int World::getUnitCountOfType(int factionIndex, const string &typeName){ if(factionIndexgetUnitCount(); ++i){ const Unit* unit= faction->getUnit(i); if(unit->isAlive() && unit->getType()->getName()==typeName){ @@ -472,9 +480,9 @@ int World::getUnitCountOfType(int factionIndex, const string &typeName){ } } -// ==================== PRIVATE ==================== +// ==================== PRIVATE ==================== -// ==================== private init ==================== +// ==================== private init ==================== //init basic cell state void World::initCells(){ @@ -482,12 +490,12 @@ void World::initCells(){ Logger::getInstance().add("State cells", true); for(int i=0; isetFowTexCoord(Vec2f( - i/(next2Power(map.getSurfaceW())-1.f), - j/(next2Power(map.getSurfaceH())-1.f))); + i/(next2Power(map.getSurfaceW())-1.f), + j/(next2Power(map.getSurfaceH())-1.f))); for(int k=0; ksetExplored(k, false); @@ -519,7 +527,7 @@ void World::initSplattedTextures(){ } } -//creates each faction looking at each faction name contained in GameSettings +//creates each faction looking at each faction name contained in GameSettings void World::initFactionTypes(GameSettings *gs){ Logger::getInstance().add("Faction types", true); @@ -536,7 +544,7 @@ void World::initFactionTypes(GameSettings *gs){ for(int i=0; igetFactionTypeName(i)); factions[i].init( - ft, gs->getFactionControl(i), &techTree, i, gs->getTeam(i), + ft, gs->getFactionControl(i), &techTree, i, gs->getTeam(i), gs->getStartLocationIndex(i), i==thisFactionIndex, gs->getDefaultResources()); stats.setTeam(i, gs->getTeam(i)); @@ -549,13 +557,13 @@ void World::initFactionTypes(GameSettings *gs){ void World::initMinimap(){ minimap.init(map.getW(), map.getH(), this); - Logger::getInstance().add("Compute minimap surface", true); + Logger::getInstance().add("Compute minimap surface", true); } //place units randomly aroud start location void World::initUnits(){ - - Logger::getInstance().add("Generate elements", true); + + Logger::getInstance().add("Generate elements", true); //put starting units for(int i=0; igetStartingUnit(j); int initNumber= ft->getStartingUnitAmount(j); for(int l=0; lgetGui()->getUnitTypeBuildRotation(ut->getId()); + if(Socket::enableDebugText) printf("In [%s::%s] B\n",__FILE__,__FUNCTION__); + + Unit *unit= new Unit(getNextUnitId(), Vec2i(0), ut, f, &map, unitRotation); + int startLocationIndex= f->getStartLocationIndex(); if(placeUnit(map.getStartLocation(startLocationIndex), generationArea, unit, true)){ @@ -573,7 +588,7 @@ void World::initUnits(){ unit->born(); } else{ - throw runtime_error("Unit cant be placed, this error is caused because there is no enough place to put the units near its start location, make a better map: "+unit->getType()->getName() + " Faction: "+intToStr(i)); + throw runtime_error("Unit cant be placed, this error is caused because there is no enough place to put the units near its start location, make a better map: "+unit->getType()->getName() + " Faction: "+intToStr(i)); } if(unit->getType()->hasSkillClass(scBeBuilt)){ map.flatternTerrain(unit); @@ -601,10 +616,10 @@ void World::initExplorationState(){ } -// ==================== exploration ==================== +// ==================== exploration ==================== void World::exploreCells(const Vec2i &newPos, int sightRange, int teamIndex){ - + Vec2i newSurfPos= Map::toSurfCoords(newPos); int surfSightRange= sightRange/Map::cellScale+1; @@ -614,26 +629,26 @@ void World::exploreCells(const Vec2i &newPos, int sightRange, int teamIndex){ Vec2i currRelPos= Vec2i(i, j); Vec2i currPos= newSurfPos + currRelPos; if(map.isInsideSurface(currPos)){ - + SurfaceCell *sc= map.getSurfaceCell(currPos); - + //explore if(Vec2i(0).dist(currRelPos) < surfSightRange+indirectSightRange+1){ sc->setExplored(teamIndex, true); } - + //visible if(Vec2i(0).dist(currRelPos) < surfSightRange){ sc->setVisible(teamIndex, true); } - } + } } } } //computes the fog of war texture, contained in the minimap void World::computeFow(){ - + //reset texture minimap.resetFowTex(); @@ -647,7 +662,7 @@ void World::computeFow(){ } } } - + //compute cells for(int i=0; igetUnitCount(); ++j){ @@ -681,14 +696,14 @@ void World::computeFow(){ const Unit *unit= faction->getUnit(j); if(unit->isOperative()){ int sightRange= unit->getType()->getSight(); - + //iterate through all cells PosCircularIterator pci(&map, unit->getPos(), sightRange+indirectSightRange); while(pci.next()){ Vec2i pos= pci.getPos(); Vec2i surfPos= Map::toSurfCoords(pos); - + //compute max alpha float maxAlpha; if(surfPos.x>1 && surfPos.y>1 && surfPos.xgetPos().dist(pos); if(dist>sightRange){ - alpha= clamp(1.f-(dist-sightRange)/(indirectSightRange), 0.f, maxAlpha); + alpha= clamp(1.f-(dist-sightRange)/(indirectSightRange), 0.f, maxAlpha); } else{ alpha= maxAlpha; @@ -718,4 +733,4 @@ void World::computeFow(){ } } -}}//end namespace +}}//end namespace diff --git a/source/glest_game/world/world.h b/source/glest_game/world/world.h index f337e84fd..6697e6e65 100644 --- a/source/glest_game/world/world.h +++ b/source/glest_game/world/world.h @@ -3,9 +3,9 @@ // // Copyright (C) 2001-2008 Martiño Figueroa // -// You can redistribute this code 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 +// You can redistribute this code 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 // ============================================================== @@ -86,13 +86,14 @@ private: //config bool fogOfWar; int fogOfWarSmoothingFrameSkip; - bool fogOfWarSmoothing; - + bool fogOfWarSmoothing; + Game *game; + public: World(); void end(); //to die before selection does - //get + //get int getMaxPlayers() const {return map.getMaxPlayers();} int getThisFactionIndex() const {return thisFactionIndex;} int getThisTeamIndex() const {return thisTeamIndex;} @@ -120,7 +121,7 @@ public: void loadTech(const string &dir, set &factions, Checksum* checksum); void loadMap(const string &path, Checksum* checksum); void loadScenario(const string &path, Checksum* checksum); - + //misc void update(); Unit* findUnitById(int id); @@ -145,7 +146,7 @@ public: int getUnitCountOfType(int factionIndex, const string &typeName); private: - + void initCells(); void initSplattedTextures(); void initFactionTypes(GameSettings *gs); @@ -153,7 +154,7 @@ private: void initUnits(); void initMap(); void initExplorationState(); - + //misc void tick(); void computeFow(); diff --git a/source/glest_map_editor/main.cpp b/source/glest_map_editor/main.cpp old mode 100644 new mode 100755 diff --git a/source/shared_lib/include/platform/win32/platform_util.h b/source/shared_lib/include/platform/win32/platform_util.h old mode 100644 new mode 100755 diff --git a/source/shared_lib/sources/graphics/gl/shader_gl.cpp b/source/shared_lib/sources/graphics/gl/shader_gl.cpp old mode 100644 new mode 100755 index 9a8fa498c..db0e5df46 --- a/source/shared_lib/sources/graphics/gl/shader_gl.cpp +++ b/source/shared_lib/sources/graphics/gl/shader_gl.cpp @@ -3,8 +3,8 @@ // // Copyright (C) 2001-2008 Martiño Figueroa // -// You can redistribute this code and/or modify it under -// the terms of the GNU General Public License as published +// You can redistribute this code 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 // ==============================================================