From be0275a03e239b6435c24117f61fe2b540ab2d3b Mon Sep 17 00:00:00 2001 From: CactiChameleon9 <51231053+CactiChameleon9@users.noreply.github.com> Date: Thu, 3 Mar 2022 20:08:47 +0000 Subject: [PATCH] Start git tracking --- .gitignore | 2 + default_env.tres | 7 + export_presets.cfg | 200 ++++++++++++ icon.png | Bin 0 -> 3305 bytes icon.png.import | 34 +++ project.godot | 42 +++ src/assets/TEST-ANIMATION.png | Bin 0 -> 1390 bytes src/assets/TEST-ANIMATION.png.import | 34 +++ src/assets/cursor.png | Bin 0 -> 6682 bytes src/assets/cursor.png.import | 34 +++ src/assets/global_theme.tres | 10 + src/assets/isometric_tileset/Air.png | Bin 0 -> 96 bytes src/assets/isometric_tileset/Air.png.import | 34 +++ src/assets/isometric_tileset/FlowerGrass.png | Bin 0 -> 488 bytes .../isometric_tileset/FlowerGrass.png.import | 34 +++ src/assets/isometric_tileset/Grass.png | Bin 0 -> 449 bytes src/assets/isometric_tileset/Grass.png.import | 34 +++ src/assets/isometric_tileset/Grass.png.new | Bin 0 -> 318 bytes src/assets/isometric_tileset/Grass.png.old | Bin 0 -> 410 bytes src/assets/isometric_tileset/Lava.png | Bin 0 -> 913 bytes src/assets/isometric_tileset/Lava.png.import | 34 +++ src/assets/isometric_tileset/Water.png | Bin 0 -> 321 bytes src/assets/isometric_tileset/Water.png.import | 34 +++ .../isometric_tileset/isometric_tileset.tres | 79 +++++ src/assets/mons/cat-thing-v2.png | Bin 0 -> 432 bytes src/assets/mons/cat-thing-v2.png.import | 34 +++ src/assets/shadow.png | Bin 0 -> 177 bytes src/assets/shadow.png.import | 34 +++ src/assets/title-font.ttf | Bin 0 -> 34612 bytes src/classes/Unit.gd | 100 ++++++ src/nodes/units/Foe.gd | 2 + src/nodes/units/Foe.tscn | 134 ++++++++ src/nodes/units/Friend.gd | 2 + src/nodes/units/Friend.tscn | 133 ++++++++ src/nodes/world/BattleController.gd | 51 ++++ src/nodes/world/BattleController.tscn | 6 + src/nodes/world/Cursor.gd | 111 +++++++ src/nodes/world/Cursor.tscn | 36 +++ src/nodes/world/Grid.gd | 289 ++++++++++++++++++ src/nodes/world/Grid.tscn | 9 + src/nodes/world/LoadingScreen.tscn | 87 ++++++ src/nodes/world/SelectionArea.gd | 25 ++ src/nodes/world/SelectionArea.tscn | 8 + src/nodes/world/SelectionAreaController.gd | 34 +++ src/nodes/world/SelectionAreaController.tscn | 6 + src/scenes/battles/TestingBattle.tscn | 80 +++++ 46 files changed, 1793 insertions(+) create mode 100644 .gitignore create mode 100644 default_env.tres create mode 100644 export_presets.cfg create mode 100644 icon.png create mode 100644 icon.png.import create mode 100644 project.godot create mode 100644 src/assets/TEST-ANIMATION.png create mode 100644 src/assets/TEST-ANIMATION.png.import create mode 100644 src/assets/cursor.png create mode 100644 src/assets/cursor.png.import create mode 100644 src/assets/global_theme.tres create mode 100644 src/assets/isometric_tileset/Air.png create mode 100644 src/assets/isometric_tileset/Air.png.import create mode 100644 src/assets/isometric_tileset/FlowerGrass.png create mode 100644 src/assets/isometric_tileset/FlowerGrass.png.import create mode 100644 src/assets/isometric_tileset/Grass.png create mode 100644 src/assets/isometric_tileset/Grass.png.import create mode 100644 src/assets/isometric_tileset/Grass.png.new create mode 100644 src/assets/isometric_tileset/Grass.png.old create mode 100644 src/assets/isometric_tileset/Lava.png create mode 100644 src/assets/isometric_tileset/Lava.png.import create mode 100644 src/assets/isometric_tileset/Water.png create mode 100644 src/assets/isometric_tileset/Water.png.import create mode 100644 src/assets/isometric_tileset/isometric_tileset.tres create mode 100644 src/assets/mons/cat-thing-v2.png create mode 100644 src/assets/mons/cat-thing-v2.png.import create mode 100644 src/assets/shadow.png create mode 100644 src/assets/shadow.png.import create mode 100644 src/assets/title-font.ttf create mode 100644 src/classes/Unit.gd create mode 100644 src/nodes/units/Foe.gd create mode 100644 src/nodes/units/Foe.tscn create mode 100644 src/nodes/units/Friend.gd create mode 100644 src/nodes/units/Friend.tscn create mode 100644 src/nodes/world/BattleController.gd create mode 100644 src/nodes/world/BattleController.tscn create mode 100644 src/nodes/world/Cursor.gd create mode 100644 src/nodes/world/Cursor.tscn create mode 100644 src/nodes/world/Grid.gd create mode 100644 src/nodes/world/Grid.tscn create mode 100644 src/nodes/world/LoadingScreen.tscn create mode 100644 src/nodes/world/SelectionArea.gd create mode 100644 src/nodes/world/SelectionArea.tscn create mode 100644 src/nodes/world/SelectionAreaController.gd create mode 100644 src/nodes/world/SelectionAreaController.tscn create mode 100644 src/scenes/battles/TestingBattle.tscn diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c7564b2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +android/ +.import/ diff --git a/default_env.tres b/default_env.tres new file mode 100644 index 0000000..20207a4 --- /dev/null +++ b/default_env.tres @@ -0,0 +1,7 @@ +[gd_resource type="Environment" load_steps=2 format=2] + +[sub_resource type="ProceduralSky" id=1] + +[resource] +background_mode = 2 +background_sky = SubResource( 1 ) diff --git a/export_presets.cfg b/export_presets.cfg new file mode 100644 index 0000000..9d91c71 --- /dev/null +++ b/export_presets.cfg @@ -0,0 +1,200 @@ +[preset.0] + +name="Android" +platform="Android" +runnable=true +custom_features="" +export_filter="all_resources" +include_filter="" +exclude_filter="" +export_path="" +patch_list=PoolStringArray( ) +script_export_mode=1 +script_encryption_key="" + +[preset.0.options] + +graphics/32_bits_framebuffer=true +xr_features/xr_mode=0 +xr_features/degrees_of_freedom=0 +xr_features/hand_tracking=0 +xr_features/focus_awareness=false +one_click_deploy/clear_previous_install=false +custom_template/debug="" +custom_template/release="" +custom_template/use_custom_build=false +command_line/extra_args="" +version/code=1 +version/name="1.0" +package/unique_name="org.godotengine.$genname" +package/name="" +package/signed=true +screen/immersive_mode=true +screen/orientation=0 +screen/support_small=true +screen/support_normal=true +screen/support_large=true +screen/support_xlarge=true +screen/opengl_debug=false +launcher_icons/main_192x192="" +launcher_icons/adaptive_foreground_432x432="" +launcher_icons/adaptive_background_432x432="" +keystore/debug="" +keystore/debug_user="" +keystore/debug_password="" +keystore/release="" +keystore/release_user="" +keystore/release_password="" +apk_expansion/enable=false +apk_expansion/SALT="" +apk_expansion/public_key="" +architectures/armeabi-v7a=true +architectures/arm64-v8a=true +architectures/x86=false +architectures/x86_64=false +permissions/custom_permissions=PoolStringArray( ) +permissions/access_checkin_properties=false +permissions/access_coarse_location=false +permissions/access_fine_location=false +permissions/access_location_extra_commands=false +permissions/access_mock_location=false +permissions/access_network_state=false +permissions/access_surface_flinger=false +permissions/access_wifi_state=false +permissions/account_manager=false +permissions/add_voicemail=false +permissions/authenticate_accounts=false +permissions/battery_stats=false +permissions/bind_accessibility_service=false +permissions/bind_appwidget=false +permissions/bind_device_admin=false +permissions/bind_input_method=false +permissions/bind_nfc_service=false +permissions/bind_notification_listener_service=false +permissions/bind_print_service=false +permissions/bind_remoteviews=false +permissions/bind_text_service=false +permissions/bind_vpn_service=false +permissions/bind_wallpaper=false +permissions/bluetooth=false +permissions/bluetooth_admin=false +permissions/bluetooth_privileged=false +permissions/brick=false +permissions/broadcast_package_removed=false +permissions/broadcast_sms=false +permissions/broadcast_sticky=false +permissions/broadcast_wap_push=false +permissions/call_phone=false +permissions/call_privileged=false +permissions/camera=false +permissions/capture_audio_output=false +permissions/capture_secure_video_output=false +permissions/capture_video_output=false +permissions/change_component_enabled_state=false +permissions/change_configuration=false +permissions/change_network_state=false +permissions/change_wifi_multicast_state=false +permissions/change_wifi_state=false +permissions/clear_app_cache=false +permissions/clear_app_user_data=false +permissions/control_location_updates=false +permissions/delete_cache_files=false +permissions/delete_packages=false +permissions/device_power=false +permissions/diagnostic=false +permissions/disable_keyguard=false +permissions/dump=false +permissions/expand_status_bar=false +permissions/factory_test=false +permissions/flashlight=false +permissions/force_back=false +permissions/get_accounts=false +permissions/get_package_size=false +permissions/get_tasks=false +permissions/get_top_activity_info=false +permissions/global_search=false +permissions/hardware_test=false +permissions/inject_events=false +permissions/install_location_provider=false +permissions/install_packages=false +permissions/install_shortcut=false +permissions/internal_system_window=false +permissions/internet=false +permissions/kill_background_processes=false +permissions/location_hardware=false +permissions/manage_accounts=false +permissions/manage_app_tokens=false +permissions/manage_documents=false +permissions/master_clear=false +permissions/media_content_control=false +permissions/modify_audio_settings=false +permissions/modify_phone_state=false +permissions/mount_format_filesystems=false +permissions/mount_unmount_filesystems=false +permissions/nfc=false +permissions/persistent_activity=false +permissions/process_outgoing_calls=false +permissions/read_calendar=false +permissions/read_call_log=false +permissions/read_contacts=false +permissions/read_external_storage=false +permissions/read_frame_buffer=false +permissions/read_history_bookmarks=false +permissions/read_input_state=false +permissions/read_logs=false +permissions/read_phone_state=false +permissions/read_profile=false +permissions/read_sms=false +permissions/read_social_stream=false +permissions/read_sync_settings=false +permissions/read_sync_stats=false +permissions/read_user_dictionary=false +permissions/reboot=false +permissions/receive_boot_completed=false +permissions/receive_mms=false +permissions/receive_sms=false +permissions/receive_wap_push=false +permissions/record_audio=false +permissions/reorder_tasks=false +permissions/restart_packages=false +permissions/send_respond_via_message=false +permissions/send_sms=false +permissions/set_activity_watcher=false +permissions/set_alarm=false +permissions/set_always_finish=false +permissions/set_animation_scale=false +permissions/set_debug_app=false +permissions/set_orientation=false +permissions/set_pointer_speed=false +permissions/set_preferred_applications=false +permissions/set_process_limit=false +permissions/set_time=false +permissions/set_time_zone=false +permissions/set_wallpaper=false +permissions/set_wallpaper_hints=false +permissions/signal_persistent_processes=false +permissions/status_bar=false +permissions/subscribed_feeds_read=false +permissions/subscribed_feeds_write=false +permissions/system_alert_window=false +permissions/transmit_ir=false +permissions/uninstall_shortcut=false +permissions/update_device_stats=false +permissions/use_credentials=false +permissions/use_sip=false +permissions/vibrate=false +permissions/wake_lock=false +permissions/write_apn_settings=false +permissions/write_calendar=false +permissions/write_call_log=false +permissions/write_contacts=false +permissions/write_external_storage=false +permissions/write_gservices=false +permissions/write_history_bookmarks=false +permissions/write_profile=false +permissions/write_secure_settings=false +permissions/write_settings=false +permissions/write_sms=false +permissions/write_social_stream=false +permissions/write_sync_settings=false +permissions/write_user_dictionary=false diff --git a/icon.png b/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c98fbb601c83c81ec8c22b1dba7d1d57c62b323c GIT binary patch literal 3305 zcmVNc=P)Px>qe(&U$es`gSqKCHF-lq>v1vga#%UF>TTrLR zW%{UNJKZi|Pj@Rc9GyPBD1CamMMf6SL~V^ag9~Vzut^L^0!Tv0LK0FTdnJ`x->EF(MZIP5kY*1-@^egP~7mH>({qi7{6 zQF;bN-XMq~+RzA8lI9AtJuz@PY*+{SP-Gbd@mZ(r*eE&`XO5!C>w#-pcmS28K^qzY zfTGCjor*I@ltgKb03nh#Fh$KpDL=o}gj-g4v6{}ZR1*mvXv?|gEA&Yr#r;Zw*d zUabIx8iHf+WoIO_c11Ba&!34XihSMF&C#YFDjU0)mmbXz3ex!D&t9UYp>;&R%(O(_ z*z^;&A84SWzKiQpqsdQ+Vs?rFS(f?R;c8xg_ft;Roec_~1KsVww}wzq5D}*5x6k|& zf~2A3@L4|ix|Q=L>rnmKE;B3UB=OMQxAK$Ce;LvDp?hwn-{Rn}Uo~U4IXTs4V%MQY zCWULcZFU0R%gbU;_Ef(A#76r1%|YWis0t`9$R{cyjFnsV(POrI)SGQi-l{mu{e?5R zepcp?AQ54D3g_mswd@RLn{z~;^Cl}>%j@}TWixL+audY``MmSV{-E(3R0Ws^U9%mk zmAond;N8k*{(f!}e^~d(i1Hq@jdv@XN2MLAl}3yaECf{nz5N3KMCjDCFzB_7)gkjj z>2Z={^e74l7u>P4oo1{Kc~sgFI`xP#f`uR}z_p~qLwws5)h)eLxAX=?+fB2_6kG)a zeE3U}YSi;Qc}gq*;kw|Tu5Oy{F)l`0;$$RA6)@d^I9>n9N^W1g0D!WJYJT&d@6p`W zfmWmD=^x$2@|)+=&@n(wn<-#M#zIY-iH42=UU>XI3i7l0^?#ILwb@CU63f5b_jeS| zn+d@CpB>^?Ti*1WuHSaRniWO-^Xl8!b+D0stAl$BQjr8G`KX-vGpCc0lEAKmjl6lN z5r?ddL)6hBi2|!`NM+@MRO*^qsi>~y`%4$%P+-S_M#8ibt8Pf;m7O23?cF^-X$52l zEV@3AM^`Q9vy(=)?W+gi)8lPCP&k!)Z(Bsa#m@S7j#1gzJx&pQ!yzlYvA==iExkN@ zTMnz!68Wg=9Ius~p?A=A>P(5$@#w1MG`6<$`Il8=(j0RI#KlIj>!qL4)MMjk|8*3* zbL8w!iwnbSb<*17eb=8TBt(Uv*Qz*e>>p9CRtapnJD-#&4Xd8ojIpD~Yk&6&7;_U` z|L{sgNzJAYPkIOsaN5{^*@Xva?HTkC9>DHY*!1B^L`lv1hgXhC$EO1BSh9fYXU*VG zpVwjRvs^m2ml?)B3xE2&j_YU5;Ep8=e75zefN3cSw04`>U3D&~3|AIJAJnEseqE*p>uF=1Cv$SfvI z!(+vnRMj+4vb)@8Tb~MW$}-RYemjyN^W@U3pfWj;cyehLk|6W*KkUFMkM3W9AE!Wb zTL-_}Udr6GXl}`!5;P_!3b*7=VQyM9zuR6)b6dxl?fo)@-u`$$Pu#bHB*W+#Gp!_Y z*ZdUbq#B3_QPbElK4*QE)$x+;qpGazKD1C!=jx=^ta=2+!&oRjmg4Jf{ z?T`J78TjoBD9Y&OtwFEhrIq<48uS2IEEbY8C$TVd5`X!kj*`Qd7RI`3elib!C*xb1 z(UIgPMzT12GEcpEly0*vU|ugqP(r~!E}l-JK~G&>9S_|9Aj@uD&azvVQ&RF4YZp!> zJ3hi|zlabu5u>=y+3^vqT{xAJlDCHFJ#hbn)Ya9IXwdWH;_1O)ef$at)k@qrEf%ZQ z%DU&)(a_KUxMpn2t6Mm@e?LVzaUT6LCWo=>;TzfYZ~+;U!#wJXa^g66-~d}*-Gas9 zGQt`f8d&$-daPC}H%^NkiV}?n<5oawj2=M{sHv&JXl(bWFDox6HP$o6KRY=Jl_;PR zMP?^QdD4vyrL3&XqugjTQd3idAPA(!=*P?c_!Z!e`f9aWuk~t4qQew;9IwMq>%w#92+*iNN#Qp zadB}J6)j=I#urf#czO3X!C*Z&LD5rfCLY^S$>ZP6}eFW#%-2L)+t{`cPyqLD6))yK1?m7F>6=?Y&8f)>3zbH1O)cT}QNtB4KL(A@1i zMzF88gDrb&hn~H`?o`-XUeDI@dXfwwboAS>*qvV6UMhkfzO~q$V+s%8loj4P(&9H= ze`sC`uI?L9L4e;YK&2A7XF)0}u1lh+%Z$S*Q{ORwtSHpAyWYpI>bqzU!p`gqlf$*l zO^*g(+T?Hq0n%ebkyIin(R#FM6&9;^6WJU5R)By&tZQ6PV zS^MWhqtcj}7)kON#>?4Gv(K#2=6mv)5;@W->l(1q*>9t&xfesIn$&3j4WxkffXaq0 zwwBkAD2vjoi4E8CK;cwoC3#wO!|}v-XOJ`obIo05{&DMQIRyHAd5@%-0xA%uA0UK2qng>xb(kvMzX)7t^ z);-|T`mgSsHKM$+a{!w|Mt5QLwD>sA+;u-+k%z_ZL?el$#&|kX?ygLfm zxZ^Fo^bOhx)w*6In?vS{Q|uk08cKRK}t+0ukQSCOyP$^HEC+zzX51M#=e-?*xHWMDRcLdIV41daHy{HimwDo z6!_O=*(}MK!YeyJpmgu(cF1tpEv}m;0s8{4z4HlHyMxDncn8zs!g+OXEk`CeEj}9N zq#Ag1$#jyV_5AjYQg*!mS->;`S^;iU)ih9D+eks)H2z`1RHny;F<^CEwk+}d^k^Ph zl);*XQ|ayL;rZWh=fA(G2#AJz1&r&as9I8S@9m3Owftrb5n*)pTluK^9LHOFIo{G2 zG}l$9R*{<+L2hCsOJ~Lt6Q-rRub*8X{*4{)e}>%=_&DxOFeq1LRia4Yyj*Tyynw>F zxkKf(MiaG0*L|V-^Zhtvg-(-|F0&1rU8bqab*n5TT8~C860O$|6Rt%P1=1(EjIQZ% z;Y^PU2VC*~^2!sG?mbBPS0~0yd-+086)+rHjhfk6>CB$t`o%;=kdYF9NwiKkwbIpN z;_FlOuHQHHSZ&@fUuSI-S*t`DjsiIB z{=1M@JKVC$a8z{2;xCPfRb{~T>uo#5rL4L+z9n`rSUt3Tt nAZ`TZm+q1gPVN84&*%Ra7her>#-hHS00000NkvXXu0mjf|6N@O literal 0 HcmV?d00001 diff --git a/icon.png.import b/icon.png.import new file mode 100644 index 0000000..96cbf46 --- /dev/null +++ b/icon.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://icon.png" +dest_files=[ "res://.import/icon.png-487276ed1e3a0c39cad0279d744ee560.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..4b2e54e --- /dev/null +++ b/project.godot @@ -0,0 +1,42 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=4 + +_global_script_classes=[ { +"base": "Node2D", +"class": "Unit", +"language": "GDScript", +"path": "res://src/classes/Unit.gd" +} ] +_global_script_class_icons={ +"Unit": "" +} + +[application] + +config/name="Pokemon TRPG" +run/main_scene="res://src/scenes/battles/TestingBattle.tscn" +config/icon="res://icon.png" + +[display] + +window/size/width=480 +window/size/height=270 +window/size/test_width=1366 +window/size/test_height=768 +window/dpi/allow_hidpi=true +window/stretch/mode="viewport" +window/stretch/aspect="keep" + +[rendering] + +2d/snapping/use_gpu_pixel_snap=true +batching/precision/uv_contract=true +environment/default_environment="res://default_env.tres" +quality/2d/use_pixel_snap=true diff --git a/src/assets/TEST-ANIMATION.png b/src/assets/TEST-ANIMATION.png new file mode 100644 index 0000000000000000000000000000000000000000..61c4bdb934f4d2bfede278a3480411b0f3aba570 GIT binary patch literal 1390 zcmc&!`&SYM6sDIoLv31m@ReseHSv`WS-!|eC1O6)>6|@;BZ-+sOA;BCrb8#D;NvLL z!gNgwO+)CEV1-(Wz%rkKv2wmbVaf}UcF(!@`{AB@zxz73BsTh(iLtdY001z7 zM})^4@R~uN?lLmip^U7%2H0{b{#YoWO=P`iKi)lD(U`d(jowK3nqx!=XU~?B|hSR#3CYjnImw zBm`sMx!1k1r1Vdq*N^4aPg3*plhH#PQ+%E;Qmb#sh0?mk>+9S+G%mvlFjGl_*!XOB znlEul7tV4}Jzw}7yA4Xx_D)B$=4H{n^+GXSmLmAF7>F>%Jlqlz6Q~G39z2Dz6dc@u zq;@^1W;BjG^CILqc8-XtQ*(}#p~^H53d%mn>z79skQNl($>XJWKrM}tEqm9Az91BL zoM6{U>ab?n9{kqyoC`Z$*((%799kQXk>Dl<-<>8FH)AK=K27BxB$v;0&nZ?dsH3~z z(zt4k1(nfcci1>rE#q1x_^G-y1V!(Qxo(cMPt#xDR_*o?T;1&eKS~+a$VQ?RHBF4p z@&$A;#qw~h$*!>FG+#|Sf^zf)Rskzipl*$iF%x)YIbeS0ZU^^GKPPw`ie4XWU1}u( zBQ}UiZWReangl@Z}a(XY&KxBfBBXZLgHXC@7!8C6E>_&0rSItR~WEu+17ILY0w z2W&QmOOUNhw=$0bj4C_B_3^exH}xm=Di;M&UnMQc8ELsU=QIiC(eB(s@(c2M@GC4+ zZkO=G1QC_IV#WXCn)hCraGA(Yfe$OE`ET;IzVIUcshPqwp2t?1Z!i6K5J;N2vfxaO zf!1CBXn$#$E;gL!UlR4KVN2VVf--J%Ul7zEL0$-Hi54%EaBXSg#e-`@_NoM#X}dFV ztWgSz)B+z&3<}!h315w!o9UDn07W6x$gzc@2y&CPenn1-AMiK9u_J3d^`hBZ=KJjg z2iC>s6O)qWtNV9T7U_f)aM&vqAOz|F?8A-1)+vg)T-RSufm2M3>nhTn;(_zsb164v8WMSy+2)S!$=aiG2kWo-3Kw`!Rl z5SID#HScc>$!kZjf7Uy-+(Q<2%C#&h6B`p+Ou>EjoyshIYw>NW;CdDYUS<_+c3-a2 z_jtKpbio9#t=`73+jNijpNF=QfXzz4mb}1aIW`9dj_Mxg0E_6e_w#hg6nrf=0pEu* zEZrBPy}q!P+fxz{XMt;+#a@*+YVJygyf?~E_w*N^HTV!Z literal 0 HcmV?d00001 diff --git a/src/assets/TEST-ANIMATION.png.import b/src/assets/TEST-ANIMATION.png.import new file mode 100644 index 0000000..aa10fba --- /dev/null +++ b/src/assets/TEST-ANIMATION.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/TEST-ANIMATION.png-ea871a29c89a5731e8893159b9c1a03f.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://src/assets/TEST-ANIMATION.png" +dest_files=[ "res://.import/TEST-ANIMATION.png-ea871a29c89a5731e8893159b9c1a03f.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/src/assets/cursor.png b/src/assets/cursor.png new file mode 100644 index 0000000000000000000000000000000000000000..d9fb96fbc0ca3e488d2917468d143da3bfc788fd GIT binary patch literal 6682 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 eMM%H|s@4xkBoMgg^-$6P0000Z8T literal 0 HcmV?d00001 diff --git a/src/assets/isometric_tileset/FlowerGrass.png.import b/src/assets/isometric_tileset/FlowerGrass.png.import new file mode 100644 index 0000000..51ee2e0 --- /dev/null +++ b/src/assets/isometric_tileset/FlowerGrass.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/FlowerGrass.png-d25863b4131607e845f7d89a59d13ac7.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://src/assets/isometric_tileset/FlowerGrass.png" +dest_files=[ "res://.import/FlowerGrass.png-d25863b4131607e845f7d89a59d13ac7.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/src/assets/isometric_tileset/Grass.png b/src/assets/isometric_tileset/Grass.png new file mode 100644 index 0000000000000000000000000000000000000000..b92635033b3804d7fe4284b3b4318565a1efd5fa GIT binary patch literal 449 zcmV;y0Y3hTP)Px$dr3q=R9J<@m%UEIFce0=L|%xPkRrrT7*Qr*s+&^CagzN`^Bo_GL`q}F&r%jTMT}4F2 zK2b|WT8m;rC&biLeSz1;2vzWexwdVl${DT8%dqpqU64ivi~nDS=Fp zSc%v==Ff@)VkOelF}>4s$~T52BI%gws8(N(?#e6c#e|FSw2q6c1~P)Px#_(?=TR9J=W);$h_KoAAsSwp2~u(Ytl($IMbjzB?YZEa0wJcEazv-dzIYhi}O zg~|NvvNpVmEDP^rX$HWUwl96#m)`n3##xG|)^Dem`duo3^lP;ccC+=Er4VvcivKHt zjBchXmO_Tbxr#Z6%T-K4Tys2l0D$897Y7u0@xFXdCKqIP-~0k{L9iGz0?Y*oi&;P_ z2vsZwSRq`o8X$#8i_HKEqAiXFV64TMRV*Mj3t#~(fMGhpxj>u!cAW-bg;)XS$J0#$ zv=A)-i!to%&OxMruviS>ARK@yRs$#q1>lO!fDjS_q{Ye7)s^q+$~-uJ0IvaE;N(k^ Q=>Px#07*qoM6N<$g2teM00000 literal 0 HcmV?d00001 diff --git a/src/assets/isometric_tileset/Grass.png.old b/src/assets/isometric_tileset/Grass.png.old new file mode 100644 index 0000000000000000000000000000000000000000..7ee76fe6ba53b63ebee87e3dee23dc11f15b9766 GIT binary patch literal 410 zcmV;L0cHM)P)Px$R7pfZR9J<@)-g`QFcik|FOs1H5ip^wWkD=#3>{dQxd0Lp2Vw3(kdU}V*A8r4 zp-a^biKR+I7~ok6iS75E?cym)ocw>SlPEyMxP7^AW6lSFB2{?t@T$6&=p@cBmO@yQ zHGef1;+>RYjYE*pgDJvXNN;D3a0pWDE9`<4{}HFruC_4s+Xet|aDBGdFaYeL!nEzYr@4^X`H?Cd1aKi7 zz*v|K2tj-RUsw!qLB;@_up00e(gjGu$;SL~7WG;G4JvTxY*Y)};{X5v07*qoM6N<$ Ef<}I*x&QzG literal 0 HcmV?d00001 diff --git a/src/assets/isometric_tileset/Lava.png b/src/assets/isometric_tileset/Lava.png new file mode 100644 index 0000000000000000000000000000000000000000..ec4ca82c40d4d5043b037d22a697b179975a27e5 GIT binary patch literal 913 zcmV;C18)3@P)Px&OG!jQR9J=Wmd|d~ND#(s389FG;R(2K<%qF`}g}2xzl0=2FP*&%)GqsF2T))MA{mj ze7GBty^E^vf0zHfUHzW|L;r*b7>02r0k;zwolK?H>HxALf^3IXcdB@3*7Cc#>T~WR zG6-5=Tb(N;aW_1$9TKxc&1t;>-k z`)ad7)W`}UZFB1=bBF)7jHlC1s!~K5f|pr)bez>5D{WR2w#BZ_2;Db1C%rmcG?XF0f4ls_Il z+hZnxaea5Z;}P$;G_`oa<*@x%+Tx6BzpbKf2Vz!LL=6g19!B7Uy1zq=PqaPV9N-&! zCL?Ir4EJbzd)x{5`lxtBau_eJL?j$dWz34m36V`N#?I zShcr+6XGdQ0Bb~5p*R8OAzbw_UDH*af~0`y2>m*5<<;a`z4}7qX^X5!C=7TC?2|b= zWu>(eYg~!=atLhS#}W_X#s2y3ukqunXRWQs-U(p?(_@K+&5*$9<9aM_53W7m-khGj z`<&hQNci~bS*um1L_qF{CiJa2U24zhpB8L{!0g@U4tMY8k`hresXE0Y*qp)3KOzB@ zc~7+|@T~;Kh^PtGxJ?Z&=7s>{;A6mdCNM_Cs&V?b9vaPPx#`$fD|MKh=s|35X1+-gxP?9hzp>E)n<2pif-j!5=Crj T&mN(W00000NkvXXu0mjfe~W;X literal 0 HcmV?d00001 diff --git a/src/assets/isometric_tileset/Water.png.import b/src/assets/isometric_tileset/Water.png.import new file mode 100644 index 0000000..3471854 --- /dev/null +++ b/src/assets/isometric_tileset/Water.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/Water.png-e0f4e3638d3c56e3c9c306de8de68885.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://src/assets/isometric_tileset/Water.png" +dest_files=[ "res://.import/Water.png-e0f4e3638d3c56e3c9c306de8de68885.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/src/assets/isometric_tileset/isometric_tileset.tres b/src/assets/isometric_tileset/isometric_tileset.tres new file mode 100644 index 0000000..aa1d999 --- /dev/null +++ b/src/assets/isometric_tileset/isometric_tileset.tres @@ -0,0 +1,79 @@ +[gd_resource type="TileSet" load_steps=6 format=2] + +[ext_resource path="res://src/assets/isometric_tileset/Water.png" type="Texture" id=1] +[ext_resource path="res://src/assets/isometric_tileset/Lava.png" type="Texture" id=2] +[ext_resource path="res://src/assets/isometric_tileset/Air.png" type="Texture" id=3] +[ext_resource path="res://src/assets/isometric_tileset/Grass.png" type="Texture" id=11] +[ext_resource path="res://src/assets/isometric_tileset/FlowerGrass.png" type="Texture" id=21] + +[resource] +1/name = "Grass" +1/texture = ExtResource( 11 ) +1/tex_offset = Vector2( 0, 0 ) +1/modulate = Color( 1, 1, 1, 1 ) +1/region = Rect2( 0, 0, 32, 32 ) +1/tile_mode = 0 +1/occluder_offset = Vector2( 16, 16 ) +1/navigation_offset = Vector2( 16, 16 ) +1/shape_offset = Vector2( 0, 0 ) +1/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) +1/shape_one_way = false +1/shape_one_way_margin = 0.0 +1/shapes = [ ] +1/z_index = 0 +2/name = "Water.png 2" +2/texture = ExtResource( 1 ) +2/tex_offset = Vector2( 0, 0 ) +2/modulate = Color( 1, 1, 1, 1 ) +2/region = Rect2( 0, 0, 32, 32 ) +2/tile_mode = 0 +2/occluder_offset = Vector2( 0, 0 ) +2/navigation_offset = Vector2( 0, 0 ) +2/shape_offset = Vector2( 0, 0 ) +2/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) +2/shape_one_way = false +2/shape_one_way_margin = 0.0 +2/shapes = [ ] +2/z_index = 0 +3/name = "FlowerGrass.png 3" +3/texture = ExtResource( 21 ) +3/tex_offset = Vector2( 0, 0 ) +3/modulate = Color( 1, 1, 1, 1 ) +3/region = Rect2( 0, 0, 32, 33 ) +3/tile_mode = 0 +3/occluder_offset = Vector2( 0, 0 ) +3/navigation_offset = Vector2( 0, 0 ) +3/shape_offset = Vector2( 0, 0 ) +3/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) +3/shape_one_way = false +3/shape_one_way_margin = 0.0 +3/shapes = [ ] +3/z_index = 0 +4/name = "Lava.png 4" +4/texture = ExtResource( 2 ) +4/tex_offset = Vector2( 0, 0 ) +4/modulate = Color( 1, 1, 1, 1 ) +4/region = Rect2( 0, 0, 32, 32 ) +4/tile_mode = 0 +4/occluder_offset = Vector2( 0, 0 ) +4/navigation_offset = Vector2( 0, 0 ) +4/shape_offset = Vector2( 0, 0 ) +4/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) +4/shape_one_way = false +4/shape_one_way_margin = 0.0 +4/shapes = [ ] +4/z_index = 0 +5/name = "Air.png 5" +5/texture = ExtResource( 3 ) +5/tex_offset = Vector2( 0, 0 ) +5/modulate = Color( 1, 1, 1, 1 ) +5/region = Rect2( 0, 0, 32, 32 ) +5/tile_mode = 0 +5/occluder_offset = Vector2( 0, 0 ) +5/navigation_offset = Vector2( 0, 0 ) +5/shape_offset = Vector2( 0, 0 ) +5/shape_transform = Transform2D( 1, 0, 0, 1, 0, 0 ) +5/shape_one_way = false +5/shape_one_way_margin = 0.0 +5/shapes = [ ] +5/z_index = 0 diff --git a/src/assets/mons/cat-thing-v2.png b/src/assets/mons/cat-thing-v2.png new file mode 100644 index 0000000000000000000000000000000000000000..7c8a2faa15dbef5c1372723d90b5c27d1a5a6d17 GIT binary patch literal 432 zcmV;h0Z;ykP)Px$YDq*vR9J=WRxwM%KotI-NH@3A)vZJJPASyMKhRA_$?DRvLU8EV#Z@xeEq@?W z17>oM*v(ZOEvQ4zL7p5nP2Rm&p^y(kIJkS?ci(&W?tpzqp8DqE))?)2(k`?~qkzP$+#4xz`O~o!32o`cECEeNe|r^k)}Qgz1gd11uqMh*ZIRi0!_V?k8>DtU z;uU1xa@gN#8{@o(^E%F3yCik;b8c{HVa-^|9#h?B{I>tcKVF_d?vq=(mQJ`lbHWt)z4*}Q$iB}hV?!X literal 0 HcmV?d00001 diff --git a/src/assets/shadow.png.import b/src/assets/shadow.png.import new file mode 100644 index 0000000..e323ede --- /dev/null +++ b/src/assets/shadow.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="StreamTexture" +path="res://.import/shadow.png-afa5ee30a105c2de51b186d401e4549a.stex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://src/assets/shadow.png" +dest_files=[ "res://.import/shadow.png-afa5ee30a105c2de51b186d401e4549a.stex" ] + +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=false +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/src/assets/title-font.ttf b/src/assets/title-font.ttf new file mode 100644 index 0000000000000000000000000000000000000000..75c43959b7d4f6bac582a1fae5c83d7f5733cdff GIT binary patch literal 34612 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 Nu63 void: + sprite = value + var _sprite = $Sprite + # Setter functions are called during the node's `_init()` callback, before they entered the + # tree. At that point in time, the `_sprite` variable is `null`. If so, we have to wait to + # update the sprite's properties. + if not _sprite: + # The yield keyword allows us to wait until the unit node's `_ready()` callback ended. + yield(self, "ready") + _sprite.texture = value + + +func _ready() -> void: + #registers itself on the grid and snaps to a tile + yield(get_tree().create_timer(.01),"timeout") + position = Grid.register_new_unit(self) + + z_index = height * 10 + 5 + if not is_behind: + z_index = 100 + + +func move(movement : Vector2): + if movement_points != 0: #checks if the unit has had its turn yet + + var potential_movement = Grid.move_request(movement, self) #asks the grid if it can move + if potential_movement: #if not null, and therefore the grid returned a new position + + _target_position = potential_movement[0] + var _target_height = potential_movement[1] + + #take away the movement points depending on which radius zone the unit is in + #tries radius 0, then 1, the 2, etc. until the unit is in that radius and takes it away + for i in range(movement_points, -1, -1): + var area_around = Grid.get_around_coordinate(Grid.position_to_coordinates(position, height), i) + if not area_around.has(Grid.position_to_coordinates(_target_position, _target_height)): + movement_points = movement_points - i - 1 + print(movement_points) + break + + #change the z_index + height = potential_movement[1] + z_index = height + if (potential_movement[2] == false): #not behind + z_index = 100 + + +func attack(): #TODO + if attack_points == 0: + #change animation to attacking + #make attacked change to hurt animation + #somehow change health values + #maybe using an attacked method?? + attack_points = 0 + + +func _physics_process(delta: float) -> void: + if _target_position: #TODO figure out better movement system (pathfinding) + position.x = move_toward(position.x, _target_position.x, 800 * delta) + position.y = move_toward(position.y, _target_position.y, 800 * delta) + + attack_points = false + + if attack_points == 0 && movement_points == 0 && not _has_sent_turn_completed: + emit_signal("turn_completed") + _has_sent_turn_completed = true + diff --git a/src/nodes/units/Foe.gd b/src/nodes/units/Foe.gd new file mode 100644 index 0000000..b49811a --- /dev/null +++ b/src/nodes/units/Foe.gd @@ -0,0 +1,2 @@ +tool +extends Unit diff --git a/src/nodes/units/Foe.tscn b/src/nodes/units/Foe.tscn new file mode 100644 index 0000000..b21045c --- /dev/null +++ b/src/nodes/units/Foe.tscn @@ -0,0 +1,134 @@ +[gd_scene load_steps=9 format=2] + +[ext_resource path="res://src/assets/shadow.png" type="Texture" id=1] +[ext_resource path="res://src/nodes/units/Foe.gd" type="Script" id=2] + +[sub_resource type="Animation" id=1] +resource_name = "Attack back" +length = 0.8 +step = 0.05 +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.15, 0.3, 0.45, 0.6, 0.75 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ 12, 13, 14, 15, 14, 13 ] +} + +[sub_resource type="Animation" id=2] +resource_name = "Attack front" +length = 0.8 +step = 0.05 +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.15, 0.3, 0.45, 0.6, 0.75 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ 8, 9, 10, 11, 10, 9 ] +} + +[sub_resource type="Animation" id=3] +resource_name = "Attacted" +length = 0.8 +step = 0.05 +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.15, 0.3, 0.45, 0.6, 0.75 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ 16, 17, 18, 19, 18, 17 ] +} + +[sub_resource type="Animation" id=4] +resource_name = "Attacted back" +length = 0.8 +step = 0.05 +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.15, 0.3, 0.45, 0.6, 0.75 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ 20, 21, 22, 23, 22, 21 ] +} + +[sub_resource type="Animation" id=5] +length = 0.8 +loop = true +step = 0.05 +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.15, 0.3, 0.45, 0.6, 0.75 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ 0, 1, 2, 3, 2, 1 ] +} + +[sub_resource type="Animation" id=6] +resource_name = "Idle back" +length = 0.8 +loop = true +step = 0.05 +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.15, 0.3, 0.45, 0.6, 0.75 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ 4, 5, 6, 7, 6, 5 ] +} + +[node name="Foe" type="Node2D" groups=[ +"foes", +]] +script = ExtResource( 2 ) +unit_type = "Foe" +movement_distance = 0 + +[node name="Shadow" type="Sprite" parent="."] +position = Vector2( 2.5, -8.5 ) +scale = Vector2( 1.28125, 0.90625 ) +texture = ExtResource( 1 ) + +[node name="Sprite" type="Sprite" parent="."] +position = Vector2( 2, -12 ) +hframes = 4 +vframes = 6 +frame = 12 + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +autoplay = "Idle" +"anims/Attack back" = SubResource( 1 ) +"anims/Attack front" = SubResource( 2 ) +anims/Attacted = SubResource( 3 ) +"anims/Attacted back" = SubResource( 4 ) +anims/Idle = SubResource( 5 ) +"anims/Idle back" = SubResource( 6 ) diff --git a/src/nodes/units/Friend.gd b/src/nodes/units/Friend.gd new file mode 100644 index 0000000..b49811a --- /dev/null +++ b/src/nodes/units/Friend.gd @@ -0,0 +1,2 @@ +tool +extends Unit diff --git a/src/nodes/units/Friend.tscn b/src/nodes/units/Friend.tscn new file mode 100644 index 0000000..f33ad6a --- /dev/null +++ b/src/nodes/units/Friend.tscn @@ -0,0 +1,133 @@ +[gd_scene load_steps=9 format=2] + +[ext_resource path="res://src/assets/shadow.png" type="Texture" id=2] +[ext_resource path="res://src/nodes/units/Friend.gd" type="Script" id=3] + +[sub_resource type="Animation" id=1] +resource_name = "Attack back" +length = 0.8 +step = 0.05 +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.15, 0.3, 0.45, 0.6, 0.75 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ 12, 13, 14, 15, 14, 13 ] +} + +[sub_resource type="Animation" id=2] +resource_name = "Attack front" +length = 0.8 +step = 0.05 +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.15, 0.3, 0.45, 0.6, 0.75 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ 8, 9, 10, 11, 10, 9 ] +} + +[sub_resource type="Animation" id=3] +resource_name = "Attacted" +length = 0.8 +step = 0.05 +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.15, 0.3, 0.45, 0.6, 0.75 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ 16, 17, 18, 19, 18, 17 ] +} + +[sub_resource type="Animation" id=4] +resource_name = "Attacted back" +length = 0.8 +step = 0.05 +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.15, 0.3, 0.45, 0.6, 0.75 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ 20, 21, 22, 23, 22, 21 ] +} + +[sub_resource type="Animation" id=5] +length = 0.8 +loop = true +step = 0.05 +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.15, 0.3, 0.45, 0.6, 0.75 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ 0, 1, 2, 3, 2, 1 ] +} + +[sub_resource type="Animation" id=6] +resource_name = "Idle back" +length = 0.8 +loop = true +step = 0.05 +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:frame") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.15, 0.3, 0.45, 0.6, 0.75 ), +"transitions": PoolRealArray( 1, 1, 1, 1, 1, 1 ), +"update": 1, +"values": [ 4, 5, 6, 7, 6, 5 ] +} + +[node name="Friend" type="Node2D" groups=[ +"friends", +]] +z_index = 100 +script = ExtResource( 3 ) +unit_type = "Friend" + +[node name="Shadow" type="Sprite" parent="."] +position = Vector2( 2.5, -8.5 ) +scale = Vector2( 1.28125, 0.90625 ) +texture = ExtResource( 2 ) + +[node name="Sprite" type="Sprite" parent="."] +position = Vector2( 2, -12 ) +hframes = 4 +vframes = 6 + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +autoplay = "Idle" +"anims/Attack back" = SubResource( 1 ) +"anims/Attack front" = SubResource( 2 ) +anims/Attacted = SubResource( 3 ) +"anims/Attacted back" = SubResource( 4 ) +anims/Idle = SubResource( 5 ) +"anims/Idle back" = SubResource( 6 ) diff --git a/src/nodes/world/BattleController.gd b/src/nodes/world/BattleController.gd new file mode 100644 index 0000000..5b381d2 --- /dev/null +++ b/src/nodes/world/BattleController.gd @@ -0,0 +1,51 @@ +extends Node + +export var battle_turns : int = 10 + +var _turn_number : int = 1 +var _unit_turns_completed : int = 0 +var _unit_count : int = 0 + +signal part_of_turn_done + + +func _ready() -> void: + _start_battle() + + +func _start_battle(): + for i in battle_turns: + #yield here means that it waits until the fucntion is completed + yield(_start_unit_turns("friends"), "completed") + yield(_start_unit_turns("foes"), "completed") + _turn_number = _turn_number + 1 + + +func _add_unit_turns_completed(): + #this function is called by the signal turn completed + _unit_turns_completed = _unit_turns_completed + 1 + + +func _start_unit_turns(unit_group_name : String): + var unit_array = get_tree().get_nodes_in_group(unit_group_name) + _unit_count = unit_array.size() + #connects the signal turn completed to the _add_unit_turns_completed method + for i in _unit_count: + unit_array[i].connect("turn_completed", self, "_add_unit_turns_completed") + #start the turn for all nodes in the specified group + get_tree().call_group(unit_group_name, "start_turn") + #wait until the number of turn_completed signals recieved is equal to the unit count + yield(self, "part_of_turn_done") + + #reset for next part of turn + _unit_count = 0 + _unit_turns_completed = 0 + for i in _unit_count: + unit_array[i].disconnect("turn_completed", self, "_add_unit_turns_completed") + + +func _process(delta: float) -> void: + + #wait until the number of turn_completed signals recieved is equal to the unit count + if _unit_turns_completed >= _unit_count: + emit_signal("part_of_turn_done") diff --git a/src/nodes/world/BattleController.tscn b/src/nodes/world/BattleController.tscn new file mode 100644 index 0000000..065d690 --- /dev/null +++ b/src/nodes/world/BattleController.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://src/nodes/world/BattleController.gd" type="Script" id=1] + +[node name="BattleController" type="Node"] +script = ExtResource( 1 ) diff --git a/src/nodes/world/Cursor.gd b/src/nodes/world/Cursor.gd new file mode 100644 index 0000000..f77fe28 --- /dev/null +++ b/src/nodes/world/Cursor.gd @@ -0,0 +1,111 @@ +extends Node2D +tool #allow rendering of selection box in the editor + +onready var Grid = get_node("../Grid") + +#currently selected item +var _currently_selecting = null +#current tile being hovered over +var _tile := Vector2.ZERO setget set_tile + +var _height = 0 + + +#this controls the cursors position +func set_tile(new_tile: Vector2) -> void: + + #this does all the moving checks, and returns null if invalid + var target_position = Grid.move_cursor_request(new_tile, _height) + + #if null isn't returned then the cursor can be moved and tile set + if target_position: + position = target_position[0] + _tile = new_tile + _height = target_position[1] + z_index = _height + if (target_position[2] == false): #not behind + z_index = z_index + 20 + + #starts a timer so that the movement is "staggered" - limit on speed + $Timer.start() + + +#this draws a 32x16 diamond in the center of the cursor +func _draw() -> void: + var selection_color = Color.lightblue + var selection_thickness = 2.0 + + #I don't know how to draw use draw_polygon - hence lines + draw_line(Vector2(-16,0), Vector2(0,8), selection_color, selection_thickness) + draw_line(Vector2(16,0), Vector2(0,8), selection_color, selection_thickness) + draw_line(Vector2(-16,0), Vector2(0,-8), selection_color, selection_thickness) + draw_line(Vector2(16,0), Vector2(0,-8), selection_color, selection_thickness) + + +#this function I mainly took from a GDQuest tutorial - but with a few modifications +#it detects inputs for movement moves the cursor based off that +#it also handles clicks/enter logic for moving units +func _unhandled_input(event: InputEvent) -> void: + #if the mouse is moved then change the selected tile (and therefore position) of the cursor + if event is InputEventMouseMotion: + self._tile = Grid.position_to_coordinates(event.position, 0) + + #if a left click/enter acton occurs then run the selection and movement logic + #this bit of code resets the current selection after a move or if the selection was invalid + # therefore requireing 2 successful selections to make a move (1st player, 2nd space) + elif (event is InputEventMouseButton and event.pressed == false and + event.button_index == BUTTON_LEFT or event.is_action_pressed("ui_accept")): + + #asks the selected node to to move the now selected tile if something has already been selected + if _currently_selecting: + var _currently_selecting_name = Grid.grid[_currently_selecting.x][_currently_selecting.y][0] + get_node(("../" + _currently_selecting_name)).move(_tile - _currently_selecting) + _currently_selecting = null + Grid.remove_selection() + + #therefore, if nothing is currently selected, then we need to select what we have clicked on + elif Grid.grid[_tile.x][_tile.y]: + _currently_selecting = _tile + var _currently_selecting_name = Grid.grid[_currently_selecting.x][_currently_selecting.y][0] + if get_node("../" + _currently_selecting_name).movement_points != 0: + Grid.display_selection(_tile, get_node("../" + _currently_selecting_name)) + else: + _currently_selecting = null + + #if there was no unit under the cursor then do nothing (and reset to no selection) + else: + _currently_selecting = null + + get_tree().set_input_as_handled() + + #this adds the ability to undo the selection of a unit through right click or esc + elif (event is InputEventMouseButton and event.pressed == false and + event.button_index == BUTTON_RIGHT or event.is_action_pressed("ui_cancel")): + + _currently_selecting = null + get_tree().set_input_as_handled() + + # The code below is for the cursor's movement. + # The following lines make some preliminary checks to see whether the cursor should move or not + # if the user presses an arrow key. + var should_move := event.is_pressed() + # If the player is pressing the key in this frame, we allow the cursor to move. If they keep the + # keypress down, we only want to move after the cooldown timer stops. + if event.is_echo(): + should_move = should_move and $Timer.is_stopped() + + # And if the cursor shouldn't move, we prevent it from doing so. + if not should_move: + return + + # Here, we update the cursor's current tile based on the input direction. See the set_tile() + # function below to see what changes that triggers. + if event.is_action("ui_right"): + self.tile += Vector2.RIGHT + elif event.is_action("ui_up"): + self.tile += Vector2.UP + elif event.is_action("ui_left"): + self.tile += Vector2.LEFT + elif event.is_action("ui_down"): + self.tile += Vector2.DOWN + diff --git a/src/nodes/world/Cursor.tscn b/src/nodes/world/Cursor.tscn new file mode 100644 index 0000000..88b4408 --- /dev/null +++ b/src/nodes/world/Cursor.tscn @@ -0,0 +1,36 @@ +[gd_scene load_steps=4 format=2] + +[ext_resource path="res://src/assets/cursor.png" type="Texture" id=1] +[ext_resource path="res://src/nodes/world/Cursor.gd" type="Script" id=2] + +[sub_resource type="Animation" id=1] +resource_name = "hover" +loop = true +tracks/0/type = "value" +tracks/0/path = NodePath("Sprite:position") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.5, 1 ), +"transitions": PoolRealArray( 0.499999, 2.37841, 2.46229 ), +"update": 0, +"values": [ Vector2( 8, -7 ), Vector2( 14, -16 ), Vector2( 8, -7 ) ] +} + +[node name="Cursor" type="Node2D"] +script = ExtResource( 2 ) + +[node name="Sprite" type="Sprite" parent="."] +position = Vector2( 7, -8 ) +rotation = 4.71239 +z_index = 100 +texture = ExtResource( 1 ) + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +autoplay = "hover" +anims/hover = SubResource( 1 ) + +[node name="Timer" type="Timer" parent="."] +wait_time = 0.1 diff --git a/src/nodes/world/Grid.gd b/src/nodes/world/Grid.gd new file mode 100644 index 0000000..d2568b0 --- /dev/null +++ b/src/nodes/world/Grid.gd @@ -0,0 +1,289 @@ +extends Node + +#maximum size needed for current resolution +const GRID_SIZE = Vector2(46 + 10,32 + 10) + +#found these through trial and error +#these are actually the tile-size/2 (kinda) +const X_MATRIX = Vector2(16,8) +const Y_MATRIX = Vector2(-16,8) + +#1/(Xx)(Yy)-(Yx)(Xy) +const INVERSE_MATRIX_MULTIPLIER = 1.0/((X_MATRIX.x*Y_MATRIX.y)-(Y_MATRIX.x*X_MATRIX.y)) + +#{ Xx Yx } to { Yy -Yx } +#{ Xy Yy } to { -Xy Xx } +const INVERSE_X_MATRIX = Vector2(Y_MATRIX.y,-X_MATRIX.y) +const INVERSE_Y_MATRIX = Vector2(-Y_MATRIX.x,X_MATRIX.x) + +const EMPTY_TILE = [-1] +const GROUND_TILE = [0,1] +const WATER_TILE = [2] +const AIR_TILE = [5] +const LAVA_TILE = [4] +const OBSTACLE_TILE = [] + +#setget works here because the value is gotten after the object has been +# initalised (not before), so that the GRID_SIZE actually has values +onready var grid = _create_grid(GRID_SIZE.x, GRID_SIZE.y, true) +onready var TERRAIN_GRID = _create_grid(GRID_SIZE.x, GRID_SIZE.y) + + +func _create_grid (x, y, unpopulated : bool = false) -> Vector2: + var out = [] + + #creates an array with the range from 0 to x-1 (total being x) + # with a second array inside each with the range 0 to y-1 (total being y) + for _i in range(x): + var col = [] + col.resize(y) + out.append(col) + + if unpopulated: + return out + + #populates the grid with the ids of the tilesets and the heights + #the +1, +2 etc is so that the raised piece is set to the actual position is represents + #this overrides only if the new tile wasn't empty - so the top tile and correct height are set + for i in range (GRID_SIZE.x): + for j in range (GRID_SIZE.y): + out[i][j] = [get_node("../TileMap0").get_cell(i,j), 0] + for i in range (GRID_SIZE.x): + for j in range (GRID_SIZE.y): + if get_node("../TileMap1").get_cell(i,j) != EMPTY_TILE[0]: + out[i+1][j+1] = [get_node("../TileMap1").get_cell(i,j), 1] + for i in range (GRID_SIZE.x): + for j in range (GRID_SIZE.y): + if get_node("../TileMap2").get_cell(i,j) != EMPTY_TILE[0]: + out[i+2][j+2] = [get_node("../TileMap2").get_cell(i,j), 2] + for i in range (GRID_SIZE.x): + for j in range (GRID_SIZE.y): + if get_node("../TileMap3").get_cell(i,j) != EMPTY_TILE[0]: + out[i+3][j+3] = [get_node("../TileMap3").get_cell(i,j), 3] + + return out + + +func register_new_unit (unit : Unit) -> Vector2: + #turn the position into coordinates + var current_coordinates = position_to_coordinates(unit.position, unit.height) + + #add the name (which must be unique due to godot) to the grid + grid[current_coordinates.x][current_coordinates.y] = [unit.name, unit.height] + + #snaps the unit to the correct tile + return coordinates_to_position(current_coordinates, unit.height) + + +func move_request (movement_coordinates : Vector2, unit : Unit): #TODO 3D + # recieve a movement request, DONE + # check its valid, MOSTLY DONE (HAPPY PATH!!!) + # height difference check needed... somehow TODO + # change check existing tile check TODO + # check moving across water + # change the 2d array, DONE + # send signals out to refresh position CHANGED/DONE + # now just returns the value for the unit to move + + var current_coordinates = _find_grid_coordinates(unit.name) + var target_coordinates = current_coordinates + movement_coordinates + var target_co_height = TERRAIN_GRID[target_coordinates.x][target_coordinates.y][1] + + var area_around = get_around_coordinate(current_coordinates, unit.movement_points) + var area_moveable = _filter_moveable_spaces(area_around, unit.water_walk, unit.air_walk, unit.lava_walk) + + if not area_moveable.has(target_coordinates): + return null + + #check if an another unit is in that space + if grid[target_coordinates.x][target_coordinates.y] != null: + return null + + #check if its totally behind(invalid) or partially behind(changes z_index) + #this slightly overlaps the filtering code, but not by much + var behind = false + if (get_tile_behind_state(target_coordinates) == "d"): + return null + elif(get_tile_behind_state(target_coordinates) == "p"): + behind = true + + #update where that unit is on the grid + _move_unit_in_grid(current_coordinates, target_coordinates) + + #return a value which is moved too + return [coordinates_to_position(target_coordinates, target_co_height), target_co_height, behind] + + +func move_cursor_request (target_coordinates : Vector2, height : int): #TODO 3D - no clue what to do with the cursor + #Check if its moving outside the grid + if (not _is_in_grid(target_coordinates)): + return null + + var behind = false + if (get_tile_behind_state(target_coordinates) == "d"): + return null + elif(get_tile_behind_state(target_coordinates) == "p"): + behind = true + + height = TERRAIN_GRID[target_coordinates.x][target_coordinates.y][1] + + #Return a value which is moved too + #The tile_size/2 is because nodes are in the center of a tile + return [coordinates_to_position(target_coordinates, height), height, behind] + + +func _find_grid_coordinates (name : String): + for x in GRID_SIZE.x: + for y in GRID_SIZE.y: + if grid[x][y]: + if grid[x][y][0] == name: + return Vector2(x,y) + return null + + +func _move_unit_in_grid (from : Vector2, to : Vector2): #TODO 3D + #this is a simple method that moves one value to another place on the grid + var value = grid[from.x][from.y] + grid[from.x][from.y] = null + grid[to.x][to.y] = value + + +func coordinates_to_position (coordinates : Vector2, height: int) -> Vector2: + var out = Vector2(0,-240) #the position of the ../TileMap 0,0 + out += (coordinates.x) * X_MATRIX #add the x + out += (coordinates.y) * Y_MATRIX #add the y + + out.y = out.y - height * 16 + return out + + +func position_to_coordinates (node_position : Vector2, height : int) -> Vector2: + #reverse matrix.... fun + var out = node_position - Vector2(0,-240) + var tmp_x = out.x + out.x = INVERSE_X_MATRIX.x*INVERSE_MATRIX_MULTIPLIER*out.x + INVERSE_Y_MATRIX.x*INVERSE_MATRIX_MULTIPLIER*out.y + out.y = INVERSE_X_MATRIX.y*INVERSE_MATRIX_MULTIPLIER*tmp_x + INVERSE_Y_MATRIX.y*INVERSE_MATRIX_MULTIPLIER*out.y + + #round the decimal places. Not sure why the minus one - but its needed + #each addition in height reduces each coordinate by one, so that needs to be + # added back + out.x = round(out.x) + height + out.y = round(out.y) + height + + return out + +func _is_in_grid (coordinates : Vector2) -> bool: + if (coordinates.x >= GRID_SIZE.x or + coordinates.y >= GRID_SIZE.y or + coordinates.x < 0 or + coordinates.y < 0): + return false + return true + +func get_tile_behind_state (coordinates : Vector2) -> String: + #checking if tiles are directly behind + #the plus 1 and plus 2 mean that its a height difference of 2 or 3 required respectively + if (TERRAIN_GRID[coordinates.x + 1][coordinates.y + 1][1] > TERRAIN_GRID[coordinates.x][coordinates.y][1] or + TERRAIN_GRID[coordinates.x + 2][coordinates.y + 2][1] > TERRAIN_GRID[coordinates.x][coordinates.y][1] + 1 or + TERRAIN_GRID[coordinates.x + 3][coordinates.y + 3][1] > TERRAIN_GRID[coordinates.x][coordinates.y][1] + 2): + return "d" #directly + + #checking if tiles are partially covered + elif(TERRAIN_GRID[coordinates.x][coordinates.y + 1][1] > TERRAIN_GRID[coordinates.x][coordinates.y][1] or + TERRAIN_GRID[coordinates.x + 1][coordinates.y][1] > TERRAIN_GRID[coordinates.x][coordinates.y][1] or + TERRAIN_GRID[coordinates.x + 2][coordinates.y + 1][1] > TERRAIN_GRID[coordinates.x][coordinates.y][1] + 1 or + TERRAIN_GRID[coordinates.x + 1][coordinates.y + 2][1] > TERRAIN_GRID[coordinates.x][coordinates.y][1] + 1 or + TERRAIN_GRID[coordinates.x + 3][coordinates.y + 2][1] > TERRAIN_GRID[coordinates.x][coordinates.y][1] + 2 or + TERRAIN_GRID[coordinates.x + 2][coordinates.y + 3][1] > TERRAIN_GRID[coordinates.x][coordinates.y][1] + 2): + return "p" #partially + + else: + return "n" #no + +func get_around_coordinate(coordinate : Vector2, movement_distance : int): + #found https://godotengine.org/qa/64496/how-to-get-a-random-tile-in-a-radious + + #disclude the tile being stood on + movement_distance = movement_distance + 1 + + #gets the rectangle bounding the circle + var radius_vec = Vector2(movement_distance, movement_distance) + var min_pos = (coordinate - radius_vec).floor() + var max_pos = (coordinate + radius_vec).ceil() + + #convert the mins/maxs to integers so we can use range for loop + var min_x = int(min_pos.x) + var max_x = int(max_pos.x) + var min_y = int(min_pos.y) + var max_y = int(max_pos.y) + + var positions = [] + + #gathers all the points that are within the radius + for y in range(min_y, max_y): + for x in range(min_x, max_x): + var tile_pos = Vector2(x, y) + if tile_pos.distance_to(coordinate) < movement_distance: + positions.append(tile_pos) + + return positions + +func _filter_moveable_spaces(positions_array, water_walk : bool = false, air_walk : bool = false, lava_walk : bool = false): + #this uses happy path to filter out the invalid move spaces + var new_pos_array = [] + for i in positions_array.size(): + var tile_type = TERRAIN_GRID[positions_array[i].x][positions_array[i].y][0] + + if (get_tile_behind_state(positions_array[i]) == "d"): + continue + + if (EMPTY_TILE.has(tile_type) or OBSTACLE_TILE.has(tile_type)): + continue + + if (WATER_TILE.has(tile_type) and not water_walk): + continue + + if (AIR_TILE.has(tile_type) and not air_walk): + continue + + if (LAVA_TILE.has(tile_type) and not lava_walk): + continue + + new_pos_array.append(positions_array[i]) + return new_pos_array + +func display_selection(coordinate : Vector2, unit : Unit): + var movement_amount = unit.movement_points + print("hi") + for i in range (movement_amount, -1, -1): + var area_around = get_around_coordinate(coordinate, i) + var area_around_smaller = get_around_coordinate(coordinate, i -1) + if i == 1: + area_around_smaller = [] + + for j in area_around_smaller.size(): + if area_around.has(area_around_smaller[j]): + area_around.remove(area_around.find(area_around_smaller[j])) + + var area_moveable = _filter_moveable_spaces(area_around, unit.water_walk, unit.air_walk, unit.lava_walk) + $SelectionAreaController.create_selection_from_array(area_moveable, i) + +func remove_selection(): + $SelectionAreaController.emit_signal("remove_selection") + + + + + + + + + #func get_around_coordinate(coordinate : Vector2, movement_distance : int): +# #this generates the list of coordinates that a unit can move too +# #the radius + radius (either side) + 1 (the center) +# var positions_array = [] +# for i in movement_distance + movement_distance + 1: +# for j in movement_distance + movement_distance + 1: +# positions_array.append(coordinate - Vector2(movement_distance, movement_distance) + Vector2(i,j)) +# +# return positions_array diff --git a/src/nodes/world/Grid.tscn b/src/nodes/world/Grid.tscn new file mode 100644 index 0000000..2b59f0d --- /dev/null +++ b/src/nodes/world/Grid.tscn @@ -0,0 +1,9 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://src/nodes/world/Grid.gd" type="Script" id=1] +[ext_resource path="res://src/nodes/world/SelectionAreaController.tscn" type="PackedScene" id=2] + +[node name="Grid" type="Node"] +script = ExtResource( 1 ) + +[node name="SelectionAreaController" parent="." instance=ExtResource( 2 )] diff --git a/src/nodes/world/LoadingScreen.tscn b/src/nodes/world/LoadingScreen.tscn new file mode 100644 index 0000000..fc1ed7f --- /dev/null +++ b/src/nodes/world/LoadingScreen.tscn @@ -0,0 +1,87 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://src/assets/global_theme.tres" type="Theme" id=1] + +[sub_resource type="Animation" id=1] +resource_name = "Loading" +length = 2.0 +step = 0.5 +tracks/0/type = "value" +tracks/0/path = NodePath("Label:text") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/keys = { +"times": PoolRealArray( 0, 0.5, 1, 1.5 ), +"transitions": PoolRealArray( 1, 1, 1, 1 ), +"update": 1, +"values": [ "Loading", "Loading.", "Loading..", "Loading..." ] +} +tracks/1/type = "method" +tracks/1/path = NodePath(".") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/keys = { +"times": PoolRealArray( 2 ), +"transitions": PoolRealArray( 1 ), +"values": [ { +"args": [ ], +"method": "queue_free" +} ] +} + +[node name="LoadingScreen" type="CanvasLayer"] + +[node name="ColorRect" type="ColorRect" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +theme = ExtResource( 1 ) +color = Color( 0.258824, 0.643137, 0.34902, 1 ) +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label" type="Label" parent="."] +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +margin_left = -240.0 +margin_top = -52.0 +margin_right = 240.0 +margin_bottom = -19.0 +theme = ExtResource( 1 ) +text = "Loading" +align = 1 +valign = 1 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +autoplay = "Loading" +anims/Loading = SubResource( 1 ) + +[node name="Timers" type="Node" parent="."] + +[node name="Timer" type="Timer" parent="Timers"] +wait_time = 0.5 +one_shot = true +autostart = true + +[node name="Timer2" type="Timer" parent="Timers"] +one_shot = true +autostart = true + +[node name="Timer3" type="Timer" parent="Timers"] +wait_time = 1.5 +one_shot = true +autostart = true + +[node name="Timer4" type="Timer" parent="Timers"] +wait_time = 2.0 +one_shot = true +autostart = true diff --git a/src/nodes/world/SelectionArea.gd b/src/nodes/world/SelectionArea.gd new file mode 100644 index 0000000..734155b --- /dev/null +++ b/src/nodes/world/SelectionArea.gd @@ -0,0 +1,25 @@ +extends Node2D +tool #allow rendering of selection box in the editor + +const RED = Color("#ac3232") +const ORANGE = Color("#df7126") +const YELLOW = Color("#fbf236") +const GREEN = Color("99e550") +const TURQ = Color("#37946e") +const BLUE = Color("#5b6ee1") +const PURPLE = Color("#76428a") +const PINK = Color("#d77bba") + +var selection_colors = [RED, ORANGE, YELLOW, GREEN, TURQ, BLUE, PURPLE, PINK] +var selection_color_index = 0 + + +func _draw() -> void: + + if selection_color_index >= len(selection_colors): + selection_color_index -= len(selection_colors) + + var selection_thickness = 2.0 + var selection_shape = PoolVector2Array([Vector2(-16,0), Vector2(0,8), Vector2(16, 0), Vector2(0, -8)]) + + draw_colored_polygon(selection_shape, selection_colors[selection_color_index]) diff --git a/src/nodes/world/SelectionArea.tscn b/src/nodes/world/SelectionArea.tscn new file mode 100644 index 0000000..1a76514 --- /dev/null +++ b/src/nodes/world/SelectionArea.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://src/nodes/world/SelectionArea.gd" type="Script" id=1] + +[node name="SelectionArea" type="Node2D"] +modulate = Color( 1, 1, 1, 0.843137 ) +z_index = 5 +script = ExtResource( 1 ) diff --git a/src/nodes/world/SelectionAreaController.gd b/src/nodes/world/SelectionAreaController.gd new file mode 100644 index 0000000..8b02f82 --- /dev/null +++ b/src/nodes/world/SelectionAreaController.gd @@ -0,0 +1,34 @@ +extends Node + +signal remove_selection + +var SELECTION_AREA = preload("res://src/nodes/world/SelectionArea.tscn") + +onready var Grid = get_parent() + + +func create_selection_from_array(coordinates, color_index : int): + for i in coordinates.size(): + create_selection(coordinates[i], color_index) + + +func create_selection(coordinate : Vector2, color_index : int): + var instanced_selection_area = SELECTION_AREA.instance() + + connect("remove_selection", instanced_selection_area, "queue_free") + + instanced_selection_area.position = Grid.coordinates_to_position(coordinate, Grid.TERRAIN_GRID[coordinate.x][coordinate.y][1]) + if (Grid.get_tile_behind_state(coordinate) == "p"): + instanced_selection_area.z_index = Grid.TERRAIN_GRID[coordinate.x][coordinate.y][1] + instanced_selection_area.selection_color_index = color_index + + add_child(instanced_selection_area) + + +#func _ready() -> void: +# yield(get_tree().create_timer(0.1), "timeout") +# create_selection(Vector2(29,18)) +# create_selection(Vector2(29,19)) +# yield(get_tree().create_timer(10), "timeout") +# emit_signal("remove_selection") +# print("destroyed") diff --git a/src/nodes/world/SelectionAreaController.tscn b/src/nodes/world/SelectionAreaController.tscn new file mode 100644 index 0000000..89b8b63 --- /dev/null +++ b/src/nodes/world/SelectionAreaController.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://src/nodes/world/SelectionAreaController.gd" type="Script" id=1] + +[node name="SelectionAreaController" type="Node"] +script = ExtResource( 1 ) diff --git a/src/scenes/battles/TestingBattle.tscn b/src/scenes/battles/TestingBattle.tscn new file mode 100644 index 0000000..c3d7dbc --- /dev/null +++ b/src/scenes/battles/TestingBattle.tscn @@ -0,0 +1,80 @@ +[gd_scene load_steps=10 format=2] + +[ext_resource path="res://src/assets/isometric_tileset/isometric_tileset.tres" type="TileSet" id=1] +[ext_resource path="res://src/nodes/units/Friend.tscn" type="PackedScene" id=2] +[ext_resource path="res://src/nodes/world/Cursor.tscn" type="PackedScene" id=3] +[ext_resource path="res://src/nodes/world/Grid.tscn" type="PackedScene" id=4] +[ext_resource path="res://src/nodes/world/LoadingScreen.tscn" type="PackedScene" id=5] +[ext_resource path="res://src/assets/TEST-ANIMATION.png" type="Texture" id=6] +[ext_resource path="res://icon.png" type="Texture" id=7] +[ext_resource path="res://src/nodes/world/BattleController.tscn" type="PackedScene" id=8] +[ext_resource path="res://src/nodes/units/Foe.tscn" type="PackedScene" id=9] + +[node name="TestingBattle" type="Node2D"] + +[node name="TileMap0" type="TileMap" parent="."] +position = Vector2( 0, -248 ) +mode = 1 +tile_set = ExtResource( 1 ) +cell_size = Vector2( 32, 16 ) +format = 1 +tile_data = PoolIntArray( 655381, 1, 0, 655382, 1, 0, 655383, 1, 0, 655384, 1, 0, 655385, 1, 0, 655386, 1, 0, 720916, 1, 0, 720917, 1, 0, 720918, 1, 0, 720919, 1, 0, 720920, 1, 0, 720921, 1, 0, 720922, 1, 0, 720923, 1, 0, 720924, 1, 0, 720925, 1, 0, 720926, 1, 0, 720927, 1, 0, 786452, 1, 0, 786453, 1, 0, 786454, 4, 0, 786455, 1, 0, 786456, 1, 0, 786457, 1, 0, 786458, 1, 0, 786459, 1, 0, 786460, 1, 0, 786461, 1, 0, 786462, 1, 0, 786463, 1, 0, 786464, 1, 0, 786465, 1, 0, 851986, 1, 0, 851987, 1, 0, 851988, 1, 0, 851989, 4, 0, 851990, 4, 0, 851991, 4, 0, 851992, 1, 0, 851993, 1, 0, 851994, 1, 0, 851995, 2, 0, 851996, 2, 0, 851997, 1, 0, 851998, 1, 0, 851999, 1, 0, 852000, 1, 0, 852001, 1, 0, 852002, 1, 0, 917522, 1, 0, 917523, 1, 0, 917524, 4, 0, 917525, 4, 0, 917526, 4, 0, 917527, 4, 0, 917528, 1, 0, 917529, 1, 0, 917530, 2, 0, 917531, 2, 0, 917532, 2, 0, 917533, 2, 0, 917534, 2, 0, 917535, 2, 0, 917536, 2, 0, 917537, 1, 0, 917538, 1, 0, 917539, 1, 0, 917540, 1, 0, 983058, 1, 0, 983059, 1, 0, 983060, 4, 0, 983061, 4, 0, 983062, 4, 0, 983063, 4, 0, 983064, 1, 0, 983065, 1, 0, 983066, 2, 0, 983067, 2, 0, 983068, 2, 0, 983069, 2, 0, 983070, 2, 0, 983071, 2, 0, 983072, 2, 0, 983073, 2, 0, 983074, 1, 0, 983075, 1, 0, 983076, 1, 0, 983077, 1, 0, 1048594, 1, 0, 1048595, 1, 0, 1048596, 1, 0, 1048597, 4, 0, 1048598, 4, 0, 1048599, 1, 0, 1048600, 1, 0, 1048601, 2, 0, 1048602, 2, 0, 1048603, 2, 0, 1048604, 2, 0, 1048605, 2, 0, 1048606, 2, 0, 1048607, 2, 0, 1048608, 2, 0, 1048609, 2, 0, 1048610, 2, 0, 1048611, 1, 0, 1048612, 1, 0, 1048613, 1, 0, 1048614, 1, 0, 1114131, 1, 0, 1114132, 1, 0, 1114133, 1, 0, 1114134, 1, 0, 1114135, 1, 0, 1114136, 1, 0, 1114137, 2, 0, 1114138, 2, 0, 1114139, 2, 0, 1114140, 2, 0, 1114141, 2, 0, 1114142, 2, 0, 1114143, 2, 0, 1114144, 2, 0, 1114145, 2, 0, 1114146, 1, 0, 1114147, 1, 0, 1114148, 5, 0, 1114149, 1, 0, 1114150, 1, 0, 1179667, 1, 0, 1179668, 1, 0, 1179669, 1, 0, 1179670, 1, 0, 1179671, 1, 0, 1179672, 1, 0, 1179673, 2, 0, 1179674, 2, 0, 1179675, 2, 0, 1179676, 2, 0, 1179677, 2, 0, 1179678, 2, 0, 1179679, 2, 0, 1179680, 2, 0, 1179681, 2, 0, 1179682, 1, 0, 1179683, 5, 0, 1179684, 1, 0, 1179685, 5, 0, 1179686, 1, 0, 1179687, 1, 0, 1245204, 1, 0, 1245205, 1, 0, 1245206, 1, 0, 1245207, 1, 0, 1245208, 1, 0, 1245209, 1, 0, 1245210, 2, 0, 1245211, 2, 0, 1245212, 2, 0, 1245213, 2, 0, 1245214, 2, 0, 1245215, 2, 0, 1245216, 2, 0, 1245217, 2, 0, 1245218, 1, 0, 1245219, 1, 0, 1245220, 5, 0, 1245221, 1, 0, 1245222, 5, 0, 1245223, 1, 0, 1310741, 1, 0, 1310742, 1, 0, 1310743, 1, 0, 1310744, 3, 0, 1310745, 3, 0, 1310746, 2, 0, 1310747, 2, 0, 1310748, 2, 0, 1310749, 2, 0, 1310750, 2, 0, 1310751, 2, 0, 1310752, 2, 0, 1310753, 2, 0, 1310754, 1, 0, 1310755, 5, 0, 1310756, 1, 0, 1310757, 5, 0, 1310758, 1, 0, 1310759, 1, 0, 1376278, 1, 0, 1376279, 1, 0, 1376280, 3, 0, 1376281, 3, 0, 1376282, 1, 0, 1376283, 2, 0, 1376284, 2, 0, 1376285, 2, 0, 1376286, 2, 0, 1376287, 2, 0, 1376288, 2, 0, 1376289, 2, 0, 1376290, 1, 0, 1376291, 1, 0, 1376292, 5, 0, 1376293, 1, 0, 1376294, 1, 0, 1376295, 1, 0, 1441815, 1, 0, 1441816, 1, 0, 1441817, 3, 0, 1441818, 3, 0, 1441819, 1, 0, 1441820, 2, 0, 1441821, 2, 0, 1441822, 2, 0, 1441823, 2, 0, 1441824, 2, 0, 1441825, 1, 0, 1441826, 1, 0, 1441827, 5, 0, 1441828, 1, 0, 1441829, 1, 0, 1441830, 1, 0, 1507352, 1, 0, 1507353, 1, 0, 1507354, 3, 0, 1507355, 1, 0, 1507356, 1, 0, 1507357, 2, 0, 1507358, 2, 0, 1507359, 2, 0, 1507360, 1, 0, 1507361, 1, 0, 1507362, 1, 0, 1507363, 1, 0, 1507364, 1, 0, 1507365, 1, 0, 1572889, 1, 0, 1572890, 1, 0, 1572891, 1, 0, 1572892, 1, 0, 1572893, 1, 0, 1572894, 1, 0, 1572895, 1, 0, 1572896, 1, 0, 1572897, 1, 0, 1572898, 1, 0, 1572899, 1, 0, 1572900, 1, 0, 1638426, 1, 0, 1638427, 1, 0, 1638428, 1, 0, 1638429, 1, 0, 1638430, 1, 0, 1638431, 1, 0, 1638432, 1, 0, 1638433, 1, 0, 1638434, 1, 0, 1638435, 1, 0, 1703963, 1, 0, 1703964, 1, 0, 1703965, 1, 0, 1703966, 1, 0, 1703967, 1, 0, 1703968, 1, 0, 1703969, 1, 0, 1769501, 1, 0, 1769502, 1, 0 ) + +[node name="TileMap1" type="TileMap" parent="."] +position = Vector2( 0, -248 ) +z_index = 1 +mode = 1 +tile_set = ExtResource( 1 ) +cell_size = Vector2( 32, 16 ) +format = 1 +tile_data = PoolIntArray( 983067, 1, 0, 1048603, 1, 0, 1048604, 1, 0, 1048605, 1, 0, 1048606, 1, 0, 1114139, 1, 0, 1114140, 1, 0, 1114141, 1, 0, 1114142, 1, 0, 1179676, 1, 0, 1179677, 1, 0, 1179678, 1, 0, 1245212, 1, 0 ) + +[node name="TileMap2" type="TileMap" parent="."] +position = Vector2( 0, -248 ) +z_index = 2 +mode = 1 +tile_set = ExtResource( 1 ) +cell_size = Vector2( 32, 16 ) +format = 1 +tile_data = PoolIntArray( 983068, 1, 0, 983069, 1, 0 ) + +[node name="TileMap3" type="TileMap" parent="."] +position = Vector2( 0, -248 ) +z_index = 3 +mode = 1 +tile_set = ExtResource( 1 ) +cell_size = Vector2( 32, 16 ) +format = 1 +tile_data = PoolIntArray( 917531, 1, 0 ) + +[node name="Friend" parent="." instance=ExtResource( 2 )] +position = Vector2( 160, 165 ) +movement_distance = 7 +water_walk = true +air_walk = true +lava_walk = true +sprite = ExtResource( 6 ) + +[node name="Cursor" parent="." instance=ExtResource( 3 )] +position = Vector2( 112, 136 ) + +[node name="Friend2" parent="." instance=ExtResource( 2 )] +position = Vector2( 256, 193 ) +movement_distance = 3 +water_walk = true +air_walk = true +lava_walk = true +sprite = ExtResource( 6 ) + +[node name="Foe" parent="." instance=ExtResource( 9 )] +position = Vector2( 74, 87 ) +movement_distance = 10 +sprite = ExtResource( 7 ) + +[node name="Grid" parent="." instance=ExtResource( 4 )] + +[node name="BattleController" parent="." instance=ExtResource( 8 )] + +[node name="LoadingScreen" parent="." instance=ExtResource( 5 )] +scale = Vector2( 0.001, 0.001 ) +transform = Transform2D( 0.001, 0, 0, 0.001, 0, 0 )