Compare commits

..

3 Commits

Author SHA1 Message Date
Sara 2ff77e8f2a feat: updated player and added player input 2024-02-08 12:42:35 +01:00
Sara 666d417264 feat: imported more assets 2024-02-08 12:42:16 +01:00
Sara e8808bfe49 feat: updated designs 2024-02-06 15:54:14 +01:00
77 changed files with 10592 additions and 315 deletions

View File

@ -24,11 +24,12 @@
inkscape:pagecheckerboard="0" inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm" inkscape:document-units="mm"
inkscape:zoom="0.92747768" inkscape:zoom="0.93240622"
inkscape:cx="1998.9699" inkscape:cx="1521.8689"
inkscape:cy="923.47236" inkscape:cy="440.25875"
inkscape:current-layer="layer1" inkscape:current-layer="layer1"
showgrid="false"><inkscape:page showgrid="false"
inkscape:export-bgcolor="#ffffffff"><inkscape:page
x="0" x="0"
y="0" y="0"
width="297" width="297"
@ -249,403 +250,396 @@
style="font-size:16px;line-height:1;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect1);shape-padding:31.8441;display:inline;fill:#1b1b1b;stroke-width:3.00094;stroke-linejoin:round"><tspan style="font-size:16px;line-height:1;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans';text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect1);shape-padding:31.8441;display:inline;fill:#1b1b1b;stroke-width:3.00094;stroke-linejoin:round"><tspan
x="31.84375" x="31.84375"
y="44.32375" y="44.32375"
id="tspan4"><tspan id="tspan10"><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan1">Concept</tspan><tspan id="tspan2">Concept</tspan><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan3"> id="tspan9">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="60.32375" y="60.32375"
id="tspan6"><tspan id="tspan12"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan5">3D fixed camera dungeon crawler where the player is placed in a randomly selected sequence of rooms id="tspan11">3D fixed camera dungeon crawler where the player is placed in a randomly selected sequence of rooms
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="76.32375" y="76.32375"
id="tspan88"><tspan id="tspan15"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan7">and asked to clear as many rooms as possible within a 5min timeframe. id="tspan13">and asked to clear as many rooms as possible within a 5min timeframe.
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="92.32375" y="92.32375"
id="tspan129"><tspan id="tspan17"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan122"> id="tspan16">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="108.32375" y="108.32375"
id="tspan141"><tspan id="tspan19"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan131">The environments are an overgrown forest ruin made using a combination of the Nature pack and Prototype assets. id="tspan18">The environments are an overgrown forest ruin made using a combination of the Nature pack and Prototype assets.
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="124.32375" y="124.32375"
id="tspan143"><tspan id="tspan21"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan142"> id="tspan20">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="140.32375" y="140.32375"
id="tspan155"><tspan id="tspan25"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan150">The </tspan><tspan id="tspan22">The </tspan><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan153">player</tspan><tspan id="tspan23">player</tspan><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan154"> can move horizontally with the Joystick or WASD. The player has two weapons which id="tspan24"> can move horizontally with the Joystick or WASD. The player has two weapons which
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="156.32375" y="156.32375"
id="tspan157"><tspan id="tspan27"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan156">bound to two buttons (left/right mousebutton or X/Y). id="tspan26">bound to two buttons (left/right mousebutton or X/Y).
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="172.32375" y="172.32375"
id="tspan159"><tspan id="tspan29"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan158"> id="tspan28">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="188.32375" y="188.32375"
id="tspan161"><tspan id="tspan31"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan160"> id="tspan30">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="204.32375" y="204.32375"
id="tspan163"><tspan id="tspan33"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan162"> id="tspan32">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="220.32375" y="220.32375"
id="tspan165"><tspan id="tspan35"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan164"> id="tspan34">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="236.32375" y="236.32375"
id="tspan167"><tspan id="tspan37"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan166"> id="tspan36">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="252.32375" y="252.32375"
id="tspan169"><tspan id="tspan39"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan168"> id="tspan38">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="268.32375" y="268.32375"
id="tspan171"><tspan id="tspan41"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan170">There are three kinds of enemies. id="tspan40">There are three kinds of enemies.
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="284.32375" y="284.32375"
id="tspan174"><tspan id="tspan44"><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan172">&quot;Fodder&quot;</tspan><tspan id="tspan42">&quot;Fodder&quot;</tspan><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan173"> that are slow and die easilly, but if they do end up hitting you they hurt a lot. id="tspan43"> that are slow and die easilly, but if they do end up hitting you they hurt a lot.
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="300.32375" y="300.32375"
id="tspan176"><tspan id="tspan46"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan175"> id="tspan45">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="316.32375" y="316.32375"
id="tspan178"><tspan id="tspan48"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan177"> id="tspan47">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="332.32375" y="332.32375"
id="tspan180"><tspan id="tspan50"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan179"> id="tspan49">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="348.32375" y="348.32375"
id="tspan182"><tspan id="tspan52"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan181"> id="tspan51">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="364.32375" y="364.32375"
id="tspan185"><tspan id="tspan55"><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan183">&quot;Tanks&quot;</tspan><tspan id="tspan53">&quot;Tanks&quot;</tspan><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan184"> which don't hit very hard but survive for longer. id="tspan54"> which don't hit very hard but survive for longer.
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="380.32375" y="380.32375"
id="tspan187"><tspan id="tspan57"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan186"> id="tspan56">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="396.32375" y="396.32375"
id="tspan189"><tspan id="tspan59"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan188"> id="tspan58">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="412.32375" y="412.32375"
id="tspan191"><tspan id="tspan61"><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan190"> id="tspan60">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="428.32375" y="428.32375"
id="tspan194"><tspan id="tspan64"><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan192">&quot;Ranged&quot;</tspan><tspan id="tspan62">&quot;Ranged&quot;</tspan><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan193"> which, like fodder have low health, low speed, and like the tank low damage, but can hit from a range. id="tspan63"> which, like fodder have low health, low speed, and like the tank low damage, but can hit from a range.
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="444.32375" y="444.32375"
id="tspan196"><tspan id="tspan66"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan195"> id="tspan65">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="460.32375" y="460.32375"
id="tspan198"><tspan id="tspan68"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan197"> id="tspan67">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="476.32375" y="476.32375"
id="tspan200"><tspan id="tspan70"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan199"> id="tspan69">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="492.32375" y="492.32375"
id="tspan202"><tspan id="tspan72"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan201">There is a &quot;Berserk&quot; powerup which will give the player the power to defeat enemies in one hit for a few seconds, but when it ends it </tspan></tspan><tspan id="tspan71">There is a &quot;Berserk&quot; powerup which will give the player the power to defeat enemies in one hit for a few seconds, but when it ends it </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="508.32375" y="508.32375"
id="tspan204"><tspan id="tspan74"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan203">leaves the player unable to act for a second. id="tspan73">leaves the player unable to act for a second.
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="524.32375" y="524.32375"
id="tspan206"><tspan id="tspan76"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan205">Meaning that if the player fails to clear the room in the &quot;berserk&quot; time, they'll take a lot of hits. id="tspan75">Meaning that if the player fails to clear the room in the &quot;berserk&quot; time, they'll take a lot of hits.
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="540.32375" y="540.32375"
id="tspan208"><tspan id="tspan78"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan207"> id="tspan77">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="556.32375" y="556.32375"
id="tspan210"><tspan id="tspan80"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan209">There is a &quot;speedup&quot; powerup, which will increase the animation/movement speed for the player but drains health while active (always </tspan></tspan><tspan id="tspan79">There is a &quot;speedup&quot; powerup, which will increase the animation/movement speed for the player but drains health while active (always </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="572.32375" y="572.32375"
id="tspan212"><tspan id="tspan84"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan211">leaving a small amount to avoid frustrating deaths).</tspan></tspan></text><text id="tspan81">leaving a small amount to avoid frustrating deaths).</tspan></tspan></text><text
xml:space="preserve" xml:space="preserve"
transform="matrix(0.26458333,0,0,0.26458333,-5.8858161,-9.7341241)" transform="matrix(0.26458333,0,0,0.26458333,-5.8858161,-9.7341241)"
id="text3" id="text3"
style="font-size:16px;line-height:1;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans, Normal';text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect3);shape-padding:23.7099;display:inline;fill:#1b1b1b;stroke-width:3.00094;stroke-linejoin:round"><tspan style="font-size:16px;line-height:1;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans, Normal';text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect3);shape-padding:23.7099;display:inline;fill:#1b1b1b;stroke-width:3.00094;stroke-linejoin:round"><tspan
x="1205.7305" x="1205.7305"
y="71.800313" y="71.800313"
id="tspan214"><tspan id="tspan87"><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan213">Player: id="tspan85">Player:
</tspan></tspan><tspan </tspan></tspan><tspan
x="1205.7305" x="1205.7305"
y="87.800313" y="87.800313"
id="tspan215">- A warrior with an axe and a sword. id="tspan88">- A warrior with an axe and a sword.
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="103.80031" y="103.80031"
id="tspan216"> id="tspan89">
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="119.80031" y="119.80031"
id="tspan218"><tspan id="tspan91"><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan217">Objectives: id="tspan90">Objectives:
</tspan></tspan><tspan </tspan></tspan><tspan
x="1205.7305" x="1205.7305"
y="135.80031" y="135.80031"
id="tspan220">- Defeat all enemies.<tspan id="tspan94">- Defeat all enemies.<tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan219"> id="tspan93">
</tspan></tspan><tspan </tspan></tspan><tspan
x="1205.7305" x="1205.7305"
y="151.80031" y="151.80031"
id="tspan221">- Move to the next room. id="tspan95">- Move to the next room.
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="167.80031" y="167.80031"
id="tspan222"> id="tspan96">
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="183.80031" y="183.80031"
id="tspan224"><tspan id="tspan99"><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan223">Resources: id="tspan98">Resources:
</tspan></tspan><tspan </tspan></tspan><tspan
x="1205.7305" x="1205.7305"
y="199.80031" y="199.80031"
id="tspan225">- Health, depending on what they get hit by, the player can take 4-7 hits id="tspan100">- Health, depending on what they get hit by, the player can take 4-7 hits
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="215.80031" y="215.80031"
id="tspan226">- Time, 5 minutes id="tspan101">- Time, 5 minutes
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="231.80031" y="231.80031"
id="tspan227"> id="tspan102">
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="247.80031" y="247.80031"
id="tspan229"><tspan id="tspan104"><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan228">Mechanics: id="tspan103">Mechanics:
</tspan></tspan><tspan </tspan></tspan><tspan
x="1205.7305" x="1205.7305"
y="263.80031" y="263.80031"
id="tspan230">- Short/light/weak attack with the axe id="tspan105">- Short/light/weak attack with the axe
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="279.80031" y="279.80031"
id="tspan231">- Long/heavy/strong attack with the sword id="tspan106">- Long/heavy/strong attack with the sword
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="295.80031" y="295.80031"
id="tspan232">- Berserk powerup that has a long vulnerablility period at the end id="tspan108">- Berserk powerup that has a long vulnerablility period at the end
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="311.80031" y="311.80031"
id="tspan233">- Speed powerup that saps in the ballpark of 30% of the player's max health id="tspan109">- Speed powerup that saps in the ballpark of 30% of the player's max health
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="327.80031" y="327.80031"
id="tspan234">- The game timer ticks down to game over id="tspan110">- The game timer ticks down to game over
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="343.80031" y="343.80031"
id="tspan235">- Rooms will spawn enemies in randomly selected waves. id="tspan111">- Rooms will spawn enemies in randomly selected waves.
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="359.80031" y="359.80031"
id="tspan236">- Progress requires killing all waves of enemies id="tspan112">- Progress requires killing all waves of enemies
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="375.80031" y="375.80031"
id="tspan237"> id="tspan113">
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="391.80031" y="391.80031"
id="tspan239"><tspan id="tspan116"><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan238">Dynamics: id="tspan114">Dynamics:
</tspan></tspan><tspan </tspan></tspan><tspan
x="1205.7305" x="1205.7305"
y="407.80031" y="407.80031"
id="tspan240">- The player has to decide whether to short or long attack based on their windup/recovery durations. id="tspan117">- The player has to decide whether to short or long attack based on their windup/recovery durations.
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="423.80031" y="423.80031"
id="tspan241"> - deciding to use a long when you shouldn't would lead to getting hit during windup (canceling the action) or during winddown. id="tspan118"> - deciding to use a long when you shouldn't would lead to getting hit during windup (canceling the action) or during winddown.
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="439.80031" y="439.80031"
id="tspan242"> - But a light attack could fail to eliminate a threat in time. id="tspan119"> - But a light attack could fail to eliminate a threat in time.
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="455.80031" y="455.80031"
id="tspan243">- The player can make heavy attacks more useful by finding a speedup, but that goes at the cost of health. id="tspan120">- The player can make heavy attacks more useful by finding a speedup, but that goes at the cost of health.
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="471.80031" y="471.80031"
id="tspan244">- The player can make light attacks more useful by finding a berserk powerup, but at the risk of leaving themselves exposed after it fails. id="tspan121">- The player can make light attacks more useful by finding a berserk powerup, but at the risk of leaving themselves exposed after it fails.
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="487.80031" y="487.80031"
id="tspan245"> id="tspan122">
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="503.80031" y="503.80031"
id="tspan247"><tspan id="tspan124"><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan246">Conflict:</tspan> id="tspan123">Conflict:</tspan>
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="519.80031" y="519.80031"
id="tspan248">- The player cannot progress without defeating enemies. id="tspan125">- The player cannot progress without defeating enemies.
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="535.80031" y="535.80031"
id="tspan249">- The enemies will attack the player. id="tspan126">- The enemies will attack the player.
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="551.80031" y="551.80031"
id="tspan250"> id="tspan127">
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="567.80031" y="567.80031"
id="tspan252"><tspan id="tspan129"><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan251">Boundaries: id="tspan128">Boundaries:
</tspan></tspan><tspan </tspan></tspan><tspan
x="1205.7305" x="1205.7305"
y="583.80031" y="583.80031"
id="tspan253">- The player cannot leave the room they're in until all enemies are defeated. id="tspan130">- The player cannot leave the room they're in until all enemies are defeated.
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="599.80031" y="599.80031"
id="tspan254">- The player cannot stop an attack until it's animation is finished. id="tspan131">- The player cannot stop an attack until it's animation is finished.
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="615.80031" y="615.80031"
id="tspan255"> id="tspan132">
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="631.80031" y="631.80031"
id="tspan257"><tspan id="tspan134"><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan256">Outcome: id="tspan133">Outcome:
</tspan></tspan><tspan </tspan></tspan><tspan
x="1205.7305" x="1205.7305"
y="647.80031" y="647.80031"
id="tspan259">- The game ends when the player runs out of time or health<tspan id="tspan136">- The game ends when the player runs out of time or health<tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan258"> id="tspan135">
</tspan></tspan><tspan </tspan></tspan><tspan
x="1205.7305" x="1205.7305"
y="663.80031" y="663.80031"
id="tspan260">- The player is scored based on the number of enemies defeated id="tspan137">- The player is scored based on the number of enemies defeated
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="679.80031" y="679.80031"
id="tspan261">- After the game end screen, the game is reset for the next person. </tspan></text><image id="tspan138">- After the game end screen, the game is reset for the next person. </tspan></text><image
width="13.731021"
height="31.629169"
preserveAspectRatio="none"
xlink:href="../../../../Pictures/Screenshots/2024-02-01_10-02-1706780218.png"
id="image1"
x="10.043767"
y="33.049828" /><image
width="13.64728" width="13.64728"
height="27.455114" height="27.455114"
preserveAspectRatio="none" preserveAspectRatio="none"
@ -962,113 +956,116 @@
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker126)" style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker126)"
d="m 571.78836,168.37684 c 0,0 -1.4157,-1.41572 -1.4157,-3.87 0,-2.45428 1.51037,-3.96442 3.87,-4.05883 2.35961,-0.0944 4.43622,1.88779 4.43622,3.87 0,1.98221 -1.41571,3.77558 -1.41571,3.77558" d="m 571.78836,168.37684 c 0,0 -1.4157,-1.41572 -1.4157,-3.87 0,-2.45428 1.51037,-3.96442 3.87,-4.05883 2.35961,-0.0944 4.43622,1.88779 4.43622,3.87 0,1.98221 -1.41571,3.77558 -1.41571,3.77558"
id="path125" /><g id="path125" /><g
id="g151" id="g5"
transform="translate(30.606929,3.6243846)"><g transform="translate(21.068403,-44.544624)"><g
id="g150" id="g151"
transform="translate(0,-5.792012)"><rect transform="translate(30.606929,3.6243846)"><g
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" id="g150"
id="rect127" transform="translate(0,-5.792012)"><rect
width="34.141422" style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
height="2.9799728" id="rect127"
x="497.61777" width="34.141422"
y="135.63121" height="2.9799728"
ry="1.3179407" /><path x="497.61777"
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" y="135.63121"
d="m 502.06309,135.12888 v 4.6782" ry="1.3179407" /><path
id="path127" /><path style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" d="m 502.06309,135.12888 v 4.6782"
d="m 527.75395,135.12888 v 4.6782" id="path127" /><path
id="path128" /><rect style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
style="fill:#800000;stroke:none;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" d="m 527.75395,135.12888 v 4.6782"
id="rect147" id="path128" /><rect
width="24.226936" style="fill:#800000;stroke:none;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
height="0.73432767" id="rect147"
x="502.75674" width="24.226936"
y="136.82713" height="0.73432767"
ry="0.36716384" /></g><g x="502.75674"
id="g149"><rect y="136.82713"
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" ry="0.36716384" /></g><g
id="rect126" id="g149"><rect
width="54.677017" style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
height="2.9799652" id="rect126"
x="492.75107" width="54.677017"
y="125.63486" height="2.9799652"
ry="1.2873087" /><path x="492.75107"
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" y="125.63486"
d="m 502.06125,124.76529 v 4.6782" ry="1.2873087" /><path
id="path129" /><path style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" d="m 502.06125,124.76529 v 4.6782"
d="m 527.75211,124.76529 v 4.6782" id="path129" /><path
id="path130" /><text style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
xml:space="preserve" d="m 527.75211,124.76529 v 4.6782"
style="font-size:2.82223px;line-height:1;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-decoration-color:#000000;white-space:pre;fill:#000000;stroke:none;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" id="path130" /><text
x="493.09634" xml:space="preserve"
y="120.33974" style="font-size:2.82223px;line-height:1;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-decoration-color:#000000;white-space:pre;fill:#000000;stroke:none;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
id="text144"><tspan
sodipodi:role="line"
id="tspan144"
style="stroke-width:0.5"
x="493.09634" x="493.09634"
y="120.33974">End</tspan><tspan y="120.33974"
sodipodi:role="line" id="text144"><tspan
style="stroke-width:0.5" sodipodi:role="line"
x="493.09634" id="tspan144"
y="123.16196" style="stroke-width:0.5"
id="tspan145">Windup</tspan></text><text x="493.09634"
y="120.33974">End</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.5"
x="493.09634"
y="123.16196"
id="tspan145">Windup</tspan></text><text
xml:space="preserve"
style="font-size:2.82223px;line-height:1;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-decoration-color:#000000;white-space:pre;fill:#000000;stroke:none;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
x="526.84979"
y="120.71445"
id="text146"><tspan
sodipodi:role="line"
id="tspan146"
style="stroke-width:0.5"
x="526.84979"
y="120.71445">Start</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.5"
x="526.84979"
y="123.53667"
id="tspan147">Winddown</tspan></text><rect
style="fill:#800000;stroke:none;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
id="rect148"
width="24.226936"
height="0.73432767"
x="502.87592"
y="126.56254"
ry="0.36716384" /></g><text
xml:space="preserve" xml:space="preserve"
style="font-size:2.82223px;line-height:1;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-decoration-color:#000000;white-space:pre;fill:#000000;stroke:none;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" style="font-size:2.82223px;line-height:1;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-decoration-color:#000000;white-space:pre;fill:#800000;stroke:none;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
x="526.84979"
y="120.71445"
id="text146"><tspan
sodipodi:role="line"
id="tspan146"
style="stroke-width:0.5"
x="526.84979"
y="120.71445">Start</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.5"
x="526.84979"
y="123.53667"
id="tspan147">Winddown</tspan></text><rect
style="fill:#800000;stroke:none;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
id="rect148"
width="24.226936"
height="0.73432767"
x="502.87592"
y="126.56254"
ry="0.36716384" /></g><text
xml:space="preserve"
style="font-size:2.82223px;line-height:1;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-decoration-color:#000000;white-space:pre;fill:#800000;stroke:none;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
x="510.13458"
y="123.89542"
id="text148"><tspan
sodipodi:role="line"
id="tspan148"
style="stroke-width:0.5"
x="510.13458" x="510.13458"
y="123.89542">Hit time</tspan></text></g><text y="123.89542"
xml:space="preserve" id="text148"><tspan
style="font-size:2.82223px;line-height:1;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-decoration-color:#000000;white-space:pre;fill:#000000;stroke:none;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" sodipodi:role="line"
x="477.50571" id="tspan148"
y="131.29865" style="stroke-width:0.5"
id="text149"><tspan x="510.13458"
sodipodi:role="line" y="123.89542">Hit time</tspan></text></g><g
id="tspan149" id="g4"><text
style="fill:#000000;stroke-width:0.5" xml:space="preserve"
x="477.50571" style="font-size:2.82223px;line-height:1;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-decoration-color:#000000;white-space:pre;fill:#000000;stroke:none;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
y="131.29865">Animation timing example <tspan x="477.50571"
y="131.29865"
id="text149"><tspan
sodipodi:role="line"
id="tspan149"
style="fill:#000000;stroke-width:0.5"
x="477.50571"
y="131.29865">Animation timing example <tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan151">heavy</tspan></tspan></text><text id="tspan151">heavy</tspan></tspan></text><text
xml:space="preserve" xml:space="preserve"
style="font-size:2.82223px;line-height:1;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-decoration-color:#000000;white-space:pre;fill:#000000;stroke:none;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" style="font-size:2.82223px;line-height:1;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-decoration-color:#000000;white-space:pre;fill:#000000;stroke:none;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
x="515.86322" x="515.86322"
y="136.34253" y="136.34253"
id="text149-8"><tspan id="text149-8"><tspan
sodipodi:role="line" sodipodi:role="line"
id="tspan149-4" id="tspan149-4"
style="font-weight:bold;fill:#000000;stroke-width:0.5" style="font-weight:bold;fill:#000000;stroke-width:0.5"
x="515.86322" x="515.86322"
y="136.34253">light</tspan></text><text y="136.34253">light</tspan></text></g></g><text
xml:space="preserve" xml:space="preserve"
style="font-size:2.82223px;line-height:1;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-decoration-color:#000000;white-space:pre;fill:#000000;stroke:none;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" style="font-size:2.82223px;line-height:1;font-family:Sans;-inkscape-font-specification:'Sans, Normal';text-decoration-color:#000000;white-space:pre;fill:#000000;stroke:none;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
x="500.92786" x="500.92786"

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

View File

@ -0,0 +1,26 @@
[remap]
importer="2d_array_texture"
type="CompressedTexture2DArray"
uid="uid://dm2lhgblxb8ss"
path="res://.godot/imported/room001.exr-53d6be4a213eef0bcecf8bf0ea4f5cd9.ctexarray"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Levels/Light/room001.exr"
dest_files=["res://.godot/imported/room001.exr-53d6be4a213eef0bcecf8bf0ea4f5cd9.ctexarray"]
[params]
compress/mode=3
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/channel_pack=1
mipmaps/generate=false
mipmaps/limit=-1
slices/horizontal=1
slices/vertical=8

Binary file not shown.

View File

@ -1,26 +1,126 @@
[gd_scene load_steps=2 format=3 uid="uid://3qb27d8vkjku"] [gd_scene load_steps=13 format=3 uid="uid://3qb27d8vkjku"]
[ext_resource type="LightmapGIData" uid="uid://cfli7rodl51qd" path="res://Levels/Light/room001.lmbake" id="1_vp3o5"]
[ext_resource type="PackedScene" uid="uid://blod06auxvonj" path="res://Models/Environments/SM_Buildings_Floor_5x5_01.fbx" id="1_yoy7t"] [ext_resource type="PackedScene" uid="uid://blod06auxvonj" path="res://Models/Environments/SM_Buildings_Floor_5x5_01.fbx" id="1_yoy7t"]
[ext_resource type="PackedScene" uid="uid://dex5ugontg3g1" path="res://Models/Props/SM_Plant_Fern_01.fbx" id="2_w1kt7"]
[ext_resource type="PackedScene" uid="uid://7f1i4no3h2h5" path="res://Models/Props/SM_Plant_Fern_02.fbx" id="3_tpbl0"]
[ext_resource type="PackedScene" uid="uid://dsym0ndxgp01" path="res://Models/Props/SM_Tree_Dead_02.fbx" id="4_y48ls"]
[ext_resource type="PackedScene" uid="uid://sf2ippantsrx" path="res://Models/Props/SM_Prop_Pillar_Broken_Moss_01.fbx" id="5_qvwse"]
[ext_resource type="PackedScene" uid="uid://55s1at5inmv3" path="res://Models/Props/SM_Rock_Wall_01.fbx" id="6_m0jjr"]
[ext_resource type="PackedScene" uid="uid://up6utdya5pxh" path="res://Models/Props/SM_Prop_StoneWall_01.fbx" id="7_t3wqq"]
[ext_resource type="PackedScene" uid="uid://vgxi3xp3ces5" path="res://Models/Sky/MountainSkybox.fbx" id="9_ypm82"]
[sub_resource type="PhysicalSkyMaterial" id="PhysicalSkyMaterial_2kikw"]
[sub_resource type="Sky" id="Sky_g8k5h"]
sky_material = SubResource("PhysicalSkyMaterial_2kikw")
[sub_resource type="Environment" id="Environment_po184"]
background_mode = 2
sky = SubResource("Sky_g8k5h")
[node name="Level" type="Level"] [node name="Level" type="Level"]
[node name="Entrance" type="Entrance" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.08729, -0.00710487, -4.41459)
[node name="Root Scene" parent="." instance=ExtResource("1_yoy7t")]
transform = Transform3D(0.932476, 0, 0.361234, 0, 1, 0, -0.361234, 0, 0.932476, 2.86726, -0.000884401, -6.46443)
[node name="Root Scene2" parent="." instance=ExtResource("1_yoy7t")]
transform = Transform3D(0.932476, 0, 0.361234, 0, 1, 0, -0.361234, 0, 0.932476, 4.67343, -0.000884401, -1.80205)
[node name="Root Scene3" parent="." instance=ExtResource("1_yoy7t")]
transform = Transform3D(0.932476, 0, 0.361234, 0, 1, 0, -0.361234, 0, 0.932476, -1.79511, -0.000884401, -4.65826)
[node name="Root Scene4" parent="." instance=ExtResource("1_yoy7t")]
transform = Transform3D(0.932476, 0, 0.361234, 0, 1, 0, -0.361234, 0, 0.932476, 0.0110639, -0.000884401, 0.00411797)
[node name="Camera3D" type="Camera3D" parent="."] [node name="Camera3D" type="Camera3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 0.854549, 0.51937, 0, -0.51937, 0.854549, -3.57628e-07, 4.60657, 5.90589) transform = Transform3D(0.972427, 0.121156, -0.199266, 7.15111e-09, 0.854459, 0.519519, 0.233208, -0.505194, 0.830899, -1.07345, 5.03391, 6.47806)
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] [node name="DirectionalLight3D" type="DirectionalLight3D" parent="."]
transform = Transform3D(0.747775, -0.341732, 0.569255, 0, 0.857374, 0.514694, -0.663952, -0.384875, 0.641123, 0, 1.75292, 0) transform = Transform3D(0.479871, -0.451561, 0.752208, 3.58187e-08, 0.857374, 0.514694, -0.877339, -0.246987, 0.411429, 0, 1.75292, 0)
light_energy = 1.831
shadow_enabled = true
[node name="Entrance" type="Entrance" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.02647, -0.00710487, -0.181055)
[node name="WorldEnvironment" type="WorldEnvironment" parent="."]
environment = SubResource("Environment_po184")
[node name="LightmapGI" type="LightmapGI" parent="WorldEnvironment"]
light_data = ExtResource("1_vp3o5")
[node name="Root Scene" parent="WorldEnvironment/LightmapGI" instance=ExtResource("1_yoy7t")]
transform = Transform3D(0.932476, 0, 0.361234, 0, 1, 0, -0.361234, 0, 0.932476, 2.86726, -0.000884401, -6.46443)
[node name="Root Scene2" parent="WorldEnvironment/LightmapGI" instance=ExtResource("1_yoy7t")]
transform = Transform3D(0.932476, 0, 0.361234, 0, 1, 0, -0.361234, 0, 0.932476, 4.67343, -0.000884401, -1.80205)
[node name="Root Scene3" parent="WorldEnvironment/LightmapGI" instance=ExtResource("1_yoy7t")]
transform = Transform3D(0.932476, 0, 0.361234, 0, 1, 0, -0.361234, 0, 0.932476, -1.79511, -0.000884401, -4.65826)
[node name="Root Scene4" parent="WorldEnvironment/LightmapGI" instance=ExtResource("1_yoy7t")]
transform = Transform3D(0.932476, 0, 0.361234, 0, 1, 0, -0.361234, 0, 0.932476, 0.0110639, -0.000884401, 0.00411797)
[node name="Root Scene5" parent="WorldEnvironment/LightmapGI" instance=ExtResource("2_w1kt7")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4.96603, 0, 2.62085)
[node name="Root Scene6" parent="WorldEnvironment/LightmapGI" instance=ExtResource("3_tpbl0")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.43048, 2.38419e-07, 2.1495)
[node name="Root Scene7" parent="WorldEnvironment/LightmapGI" instance=ExtResource("2_w1kt7")]
transform = Transform3D(-0.281437, 0, -0.95958, 0, 1, 0, 0.95958, 0, -0.281437, 5.04233, 2.38419e-07, 1.64983)
[node name="Root Scene8" parent="WorldEnvironment/LightmapGI" instance=ExtResource("4_y48ls")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.30777, 0, 2.30291)
[node name="Root Scene9" parent="WorldEnvironment/LightmapGI" instance=ExtResource("5_qvwse")]
transform = Transform3D(-0.0372541, 0, 0.999306, 0, 1, 0, -0.999306, 0, -0.0372541, 4.17166, 0, 2.08067)
[node name="Root Scene11" parent="WorldEnvironment/LightmapGI" instance=ExtResource("6_m0jjr")]
transform = Transform3D(0.945029, 0, 0.326987, 0, 1, 0, -0.326987, 0, 0.945029, 5.6945, 4.76837e-07, 0.76205)
[node name="Root Scene12" parent="WorldEnvironment/LightmapGI" instance=ExtResource("6_m0jjr")]
transform = Transform3D(-0.997458, 0, -0.0712536, 0, 1, 0, 0.0712536, 0, -0.997458, 5.04292, 0, -2.4426)
[node name="Root Scene13" parent="WorldEnvironment/LightmapGI" instance=ExtResource("6_m0jjr")]
transform = Transform3D(-0.518714, 0, -0.854948, 0, 1, 0, 0.854948, 0, -0.518714, 3.71733, 4.76837e-07, -4.95217)
[node name="Root Scene14" parent="WorldEnvironment/LightmapGI" instance=ExtResource("6_m0jjr")]
transform = Transform3D(-0.894373, -0.0747678, -0.441029, 0.0303719, 0.973507, -0.226631, 0.44629, -0.216087, -0.868408, 3.9715, -0.68129, -3.51969)
[node name="Root Scene25" parent="WorldEnvironment/LightmapGI" instance=ExtResource("6_m0jjr")]
transform = Transform3D(-0.0393825, -0.103263, 0.445281, 0.436472, 0.124245, 0.0674161, -0.13576, 0.429406, 0.0875742, 1.43969, -0.218692, 3.0008)
[node name="Root Scene26" parent="WorldEnvironment/LightmapGI" instance=ExtResource("6_m0jjr")]
transform = Transform3D(-0.12461, 0.541718, -0.831273, 0.965849, -0.125595, -0.226631, -0.227174, -0.831125, -0.507567, 0.256589, 0.226632, 2.59454)
[node name="Root Scene15" parent="WorldEnvironment/LightmapGI" instance=ExtResource("6_m0jjr")]
transform = Transform3D(-0.881662, -0.398897, -0.252097, 0.290335, -0.0374126, -0.956194, 0.371991, -0.916232, 0.148799, 4.91621, 1.20005, -3.90934)
[node name="Root Scene16" parent="WorldEnvironment/LightmapGI" instance=ExtResource("6_m0jjr")]
transform = Transform3D(-1.27246, -0.717393, -0.422044, 0.791529, -0.804545, -1.01888, 0.257403, -1.07237, 1.04675, 6.55017, 2.03872, -2.07892)
[node name="Root Scene10" parent="WorldEnvironment/LightmapGI" instance=ExtResource("7_t3wqq")]
transform = Transform3D(0.985559, 0, 0.169332, 0, 1, 0, -0.169332, 0, 0.985559, 2.2975, 0, -4.98931)
[node name="Root Scene17" parent="WorldEnvironment/LightmapGI" instance=ExtResource("7_t3wqq")]
transform = Transform3D(0.86674, 0, 0.49876, 0, 1, 0, -0.49876, 0, 0.86674, -1.89462, 0, -4.39425)
[node name="Root Scene18" parent="WorldEnvironment/LightmapGI" instance=ExtResource("7_t3wqq")]
transform = Transform3D(0.985559, 0, 0.169332, 0, 1, 0, -0.169332, 0, 0.985559, 2.2975, 1, -4.98931)
[node name="Root Scene19" parent="WorldEnvironment/LightmapGI" instance=ExtResource("7_t3wqq")]
transform = Transform3D(0.86674, 0, 0.49876, 0, 1, 0, -0.49876, 0, 0.86674, -1.89462, 1, -4.39425)
[node name="Root Scene20" parent="WorldEnvironment/LightmapGI" instance=ExtResource("7_t3wqq")]
transform = Transform3D(0.985559, 0, 0.169332, 0, 1, 0, -0.169332, 0, 0.985559, 2.2975, 2, -4.98931)
[node name="Root Scene22" parent="WorldEnvironment/LightmapGI" instance=ExtResource("7_t3wqq")]
transform = Transform3D(0.985559, 0, 0.169332, 0, 1, 0, -0.169332, 0, 0.985559, 7.14722, 0, -5.80763)
[node name="Root Scene23" parent="WorldEnvironment/LightmapGI" instance=ExtResource("7_t3wqq")]
transform = Transform3D(0.985559, 0, 0.169332, 0, 1, 0, -0.169332, 0, 0.985559, 7.14722, 1, -5.80763)
[node name="Root Scene24" parent="WorldEnvironment/LightmapGI" instance=ExtResource("7_t3wqq")]
transform = Transform3D(0.985559, 0, 0.169332, 0, 1, 0, -0.169332, 0, 0.985559, 7.14722, 2, -5.80763)
[node name="Root Scene21" parent="WorldEnvironment/LightmapGI" instance=ExtResource("7_t3wqq")]
transform = Transform3D(0.86674, 0, 0.49876, 0, 1, 0, -0.49876, 0, 0.86674, -1.89462, 2, -4.39425)
[node name="Root Scene27" parent="WorldEnvironment/LightmapGI" instance=ExtResource("2_w1kt7")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.124688, 0, 3.40266)
[node name="Root Scene28" parent="WorldEnvironment/LightmapGI" instance=ExtResource("3_tpbl0")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.629966, 0, 4.02042)
[node name="Root Scene" parent="WorldEnvironment" instance=ExtResource("9_ypm82")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.568564, -0.711053, -0.05379)

Binary file not shown.

File diff suppressed because it is too large Load Diff

BIN
godot/Models/Characters/Animations/BasicMotions@Idle01.fbx (Stored with Git LFS) Normal file

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -38,6 +38,13 @@ _subresources={
"lambert3": { "lambert3": {
"use_external/enabled": true, "use_external/enabled": true,
"use_external/path": "res://Models/Characters/Materials/lambert3.tres" "use_external/path": "res://Models/Characters/Materials/lambert3.tres"
}
},
"nodes": {
"PATH:RootNode/Skeleton3D": {
"retarget/bone_map": Object(BoneMap,"resource_local_to_scene":false,"resource_name":"","profile":Object(SkeletonProfileHumanoid,"resource_local_to_scene":false,"resource_name":"","root_bone":&"Root","scale_base_bone":&"Hips","group_size":4,"bone_size":56,"script":null)
,"bonemap":null,"bone_map/Root":&"Root","bone_map/Hips":&"Hips","bone_map/Spine":&"Spine_01","bone_map/Chest":&"Spine_02","bone_map/UpperChest":&"Spine_03","bone_map/Neck":&"Neck","bone_map/Head":&"Head","bone_map/LeftEye":&"","bone_map/RightEye":&"","bone_map/Jaw":&"","bone_map/LeftShoulder":&"Clavicle_L","bone_map/LeftUpperArm":&"Shoulder_L","bone_map/LeftLowerArm":&"Elbow_L","bone_map/LeftHand":&"Hand_L","bone_map/LeftThumbMetacarpal":&"Thumb_01","bone_map/LeftThumbProximal":&"Thumb_02","bone_map/LeftThumbDistal":&"Thumb_03","bone_map/LeftIndexProximal":&"IndexFinger_01","bone_map/LeftIndexIntermediate":&"IndexFinger_02","bone_map/LeftIndexDistal":&"IndexFinger_03","bone_map/LeftMiddleProximal":&"","bone_map/LeftMiddleIntermediate":&"","bone_map/LeftMiddleDistal":&"","bone_map/LeftRingProximal":&"Finger_01","bone_map/LeftRingIntermediate":&"Finger_02","bone_map/LeftRingDistal":&"Finger_03","bone_map/LeftLittleProximal":&"","bone_map/LeftLittleIntermediate":&"","bone_map/LeftLittleDistal":&"","bone_map/RightShoulder":&"Clavicle_R","bone_map/RightUpperArm":&"Shoulder_R","bone_map/RightLowerArm":&"Elbow_R","bone_map/RightHand":&"Hand_R","bone_map/RightThumbMetacarpal":&"Thumb_01_2","bone_map/RightThumbProximal":&"Thumb_02_2","bone_map/RightThumbDistal":&"Thumb_03_2","bone_map/RightIndexProximal":&"IndexFinger_01_2","bone_map/RightIndexIntermediate":&"IndexFinger_02_2","bone_map/RightIndexDistal":&"IndexFinger_03_2","bone_map/RightMiddleProximal":&"","bone_map/RightMiddleIntermediate":&"","bone_map/RightMiddleDistal":&"","bone_map/RightRingProximal":&"Finger_01_2","bone_map/RightRingIntermediate":&"Finger_02_2","bone_map/RightRingDistal":&"Finger_03_2","bone_map/RightLittleProximal":&"","bone_map/RightLittleIntermediate":&"","bone_map/RightLittleDistal":&"","bone_map/LeftUpperLeg":&"UpperLeg_L","bone_map/LeftLowerLeg":&"LowerLeg_L","bone_map/LeftFoot":&"Ankle_L","bone_map/LeftToes":&"Toes_L","bone_map/RightUpperLeg":&"UpperLeg_R","bone_map/RightLowerLeg":&"LowerLeg_R","bone_map/RightFoot":&"Ankle_R","bone_map/RightToes":&"Toes_R","script":null)
} }
} }
} }

View File

@ -0,0 +1,63 @@
[gd_resource type="BoneMap" load_steps=2 format=3 uid="uid://dqydbxj1rggyb"]
[sub_resource type="SkeletonProfileHumanoid" id="SkeletonProfileHumanoid_7s4cy"]
[resource]
profile = SubResource("SkeletonProfileHumanoid_7s4cy")
bonemap = null
bone_map/Root = &"root"
bone_map/Hips = &"B-hips"
bone_map/Spine = &"B-spine"
bone_map/Chest = &"B-chest"
bone_map/UpperChest = &"B-upperChest"
bone_map/Neck = &"B-neck"
bone_map/Head = &"B-head"
bone_map/LeftEye = &""
bone_map/RightEye = &""
bone_map/Jaw = &""
bone_map/LeftShoulder = &"B-shoulder_L"
bone_map/LeftUpperArm = &"B-upper_arm_L"
bone_map/LeftLowerArm = &"B-forearm_L"
bone_map/LeftHand = &"B-hand_L"
bone_map/LeftThumbMetacarpal = &"B-thumb_01_L"
bone_map/LeftThumbProximal = &"B-thumb_02_L"
bone_map/LeftThumbDistal = &"B-thumb_03_L"
bone_map/LeftIndexProximal = &"B-f_index_01_L"
bone_map/LeftIndexIntermediate = &"B-f_index_02_L"
bone_map/LeftIndexDistal = &"B-f_index_03_L"
bone_map/LeftMiddleProximal = &"B-f_middle_01_L"
bone_map/LeftMiddleIntermediate = &"B-f_middle_02_L"
bone_map/LeftMiddleDistal = &"B-f_middle_03_L"
bone_map/LeftRingProximal = &"B-f_ring_01_L"
bone_map/LeftRingIntermediate = &"B-f_ring_02_L"
bone_map/LeftRingDistal = &"B-f_ring_03_L"
bone_map/LeftLittleProximal = &"B-f_pinky_01_L"
bone_map/LeftLittleIntermediate = &"B-f_pinky_02_L"
bone_map/LeftLittleDistal = &"B-f_pinky_03_L"
bone_map/RightShoulder = &"B-shoulder_R"
bone_map/RightUpperArm = &"B-upper_arm_R"
bone_map/RightLowerArm = &"B-forearm_R"
bone_map/RightHand = &"B-hand_R"
bone_map/RightThumbMetacarpal = &"B-thumb_01_R"
bone_map/RightThumbProximal = &"B-thumb_02_R"
bone_map/RightThumbDistal = &"B-thumb_03_R"
bone_map/RightIndexProximal = &"B-f_index_01_R"
bone_map/RightIndexIntermediate = &"B-f_index_02_R"
bone_map/RightIndexDistal = &"B-f_index_03_R"
bone_map/RightMiddleProximal = &"B-f_middle_01_R"
bone_map/RightMiddleIntermediate = &"B-f_middle_02_R"
bone_map/RightMiddleDistal = &"B-f_middle_03_R"
bone_map/RightRingProximal = &"B-f_ring_01_R"
bone_map/RightRingIntermediate = &"B-f_ring_02_R"
bone_map/RightRingDistal = &"B-f_ring_03_R"
bone_map/RightLittleProximal = &"B-f_pinky_01_R"
bone_map/RightLittleIntermediate = &"B-f_pinky_02_R"
bone_map/RightLittleDistal = &"B-f_pinky_03_R"
bone_map/LeftUpperLeg = &"B-thigh_L"
bone_map/LeftLowerLeg = &"B-shin_L"
bone_map/LeftFoot = &"B-foot_L"
bone_map/LeftToes = &"B-toe_L"
bone_map/RightUpperLeg = &"B-thigh_R"
bone_map/RightLowerLeg = &"B-shin_R"
bone_map/RightFoot = &"B-foot_R"
bone_map/RightToes = &"B-toe_R"

View File

@ -35,6 +35,14 @@ _subresources={
"use_external/enabled": true, "use_external/enabled": true,
"use_external/path": "res://Models/Environments/Materials/Texture_01.tres" "use_external/path": "res://Models/Environments/Materials/Texture_01.tres"
} }
},
"nodes": {
"PATH:RootNode/SM_Buildings_Floor_5x5_01": {
"generate/physics": true,
"physics/shape_type": 3,
"primitive/position": Vector3(-2.5, -0.05, 2.5),
"primitive/size": Vector3(5, 0.1, 5)
}
} }
} }
gltf/naming_version=1 gltf/naming_version=1

View File

@ -3,25 +3,26 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://dg1l3p37suwt3" uid="uid://dg1l3p37suwt3"
path="res://.godot/imported/PolygonPrototype_Texture_04.png-93559159eb3466e54b1779968421b2c3.ctex" path.s3tc="res://.godot/imported/PolygonPrototype_Texture_04.png-93559159eb3466e54b1779968421b2c3.s3tc.ctex"
metadata={ metadata={
"vram_texture": false "imported_formats": ["s3tc_bptc"],
"vram_texture": true
} }
[deps] [deps]
source_file="res://Models/Environments/Textures/PolygonPrototype_Texture_04.png" source_file="res://Models/Environments/Textures/PolygonPrototype_Texture_04.png"
dest_files=["res://.godot/imported/PolygonPrototype_Texture_04.png-93559159eb3466e54b1779968421b2c3.ctex"] dest_files=["res://.godot/imported/PolygonPrototype_Texture_04.png-93559159eb3466e54b1779968421b2c3.s3tc.ctex"]
[params] [params]
compress/mode=0 compress/mode=2
compress/high_quality=false compress/high_quality=false
compress/lossy_quality=0.7 compress/lossy_quality=0.7
compress/hdr_compression=1 compress/hdr_compression=1
compress/normal_map=0 compress/normal_map=0
compress/channel_pack=0 compress/channel_pack=0
mipmaps/generate=false mipmaps/generate=true
mipmaps/limit=-1 mipmaps/limit=-1
roughness/mode=0 roughness/mode=0
roughness/src_normal="" roughness/src_normal=""
@ -31,4 +32,4 @@ process/normal_map_invert_y=false
process/hdr_as_srgb=false process/hdr_as_srgb=false
process/hdr_clamp_exposure=false process/hdr_clamp_exposure=false
process/size_limit=0 process/size_limit=0
detect_3d/compress_to=1 detect_3d/compress_to=0

View File

@ -0,0 +1,8 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://eqoubuetw1vv"]
[ext_resource type="Texture2D" uid="uid://bd3tuw71coag3" path="res://Models/Props/Textures/Tree_Dead_Branch.png" id="1_kputc"]
[resource]
transparency = 1
cull_mode = 2
albedo_texture = ExtResource("1_kputc")

View File

@ -0,0 +1,8 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://b16k8isx1jl3g"]
[ext_resource type="Texture2D" uid="uid://b20jr1o15h27s" path="res://Models/Props/Textures/Fern_Texture.png" id="1_6x5t1"]
[resource]
transparency = 1
cull_mode = 2
albedo_texture = ExtResource("1_6x5t1")

View File

@ -0,0 +1,8 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://dsb2h5v311x85"]
[ext_resource type="Texture2D" uid="uid://by5ltkdaer7j6" path="res://Models/Props/Textures/Leaves_Generic_Texture.png" id="1_s6ykt"]
[resource]
transparency = 1
cull_mode = 2
albedo_texture = ExtResource("1_s6ykt")

View File

@ -0,0 +1,6 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://bimluh3mjp0ix"]
[ext_resource type="Texture2D" uid="uid://dhwwd6tpuq1ml" path="res://Models/Props/Textures/PolygonNature_01.png" id="1_y41cn"]
[resource]
albedo_texture = ExtResource("1_y41cn")

BIN
godot/Models/Props/SM_Plant_Fern_01.fbx (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,41 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://dex5ugontg3g1"
path="res://.godot/imported/SM_Plant_Fern_01.fbx-bc96e9be201ecd00699e36fb2c1e43d3.scn"
[deps]
source_file="res://Models/Props/SM_Plant_Fern_01.fbx"
dest_files=["res://.godot/imported/SM_Plant_Fern_01.fbx-bc96e9be201ecd00699e36fb2c1e43d3.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
import_script/path=""
_subresources={
"materials": {
"Tree": {
"use_external/enabled": true,
"use_external/path": "res://Models/Props/Materials/tree.tres"
}
}
}
gltf/naming_version=1
gltf/embedded_image_handling=1

BIN
godot/Models/Props/SM_Plant_Fern_02.fbx (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,41 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://7f1i4no3h2h5"
path="res://.godot/imported/SM_Plant_Fern_02.fbx-50caa4474dbb10d940e46905eb2514cb.scn"
[deps]
source_file="res://Models/Props/SM_Plant_Fern_02.fbx"
dest_files=["res://.godot/imported/SM_Plant_Fern_02.fbx-50caa4474dbb10d940e46905eb2514cb.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
import_script/path=""
_subresources={
"materials": {
"Tree": {
"use_external/enabled": true,
"use_external/path": "res://Models/Props/Materials/tree.tres"
}
}
}
gltf/naming_version=1
gltf/embedded_image_handling=1

BIN
godot/Models/Props/SM_Plant_Fern_03.fbx (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,34 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://bwp2qess2q1ys"
path="res://.godot/imported/SM_Plant_Fern_03.fbx-a6264c07f92255d538d1fb4ceb8e56f7.scn"
[deps]
source_file="res://Models/Props/SM_Plant_Fern_03.fbx"
dest_files=["res://.godot/imported/SM_Plant_Fern_03.fbx-a6264c07f92255d538d1fb4ceb8e56f7.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
import_script/path=""
_subresources={}
gltf/naming_version=1
gltf/embedded_image_handling=1

BIN
godot/Models/Props/SM_Prop_Pillar_Arch_01.fbx (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,34 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://bxeul7tdysdkk"
path="res://.godot/imported/SM_Prop_Pillar_Arch_01.fbx-4413a582e1cfae5afa8a779e5620b853.scn"
[deps]
source_file="res://Models/Props/SM_Prop_Pillar_Arch_01.fbx"
dest_files=["res://.godot/imported/SM_Prop_Pillar_Arch_01.fbx-4413a582e1cfae5afa8a779e5620b853.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=2
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
import_script/path=""
_subresources={}
gltf/naming_version=1
gltf/embedded_image_handling=1

BIN
godot/Models/Props/SM_Prop_Pillar_Broken_01.fbx (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,34 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://c8rbg84qs7dpe"
path="res://.godot/imported/SM_Prop_Pillar_Broken_01.fbx-6ad9a9ba4b311baa0e56a49b80cba490.scn"
[deps]
source_file="res://Models/Props/SM_Prop_Pillar_Broken_01.fbx"
dest_files=["res://.godot/imported/SM_Prop_Pillar_Broken_01.fbx-6ad9a9ba4b311baa0e56a49b80cba490.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
import_script/path=""
_subresources={}
gltf/naming_version=1
gltf/embedded_image_handling=1

BIN
godot/Models/Props/SM_Prop_Pillar_Broken_02.fbx (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,34 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://we6jqboy2bwa"
path="res://.godot/imported/SM_Prop_Pillar_Broken_02.fbx-6e0d22869934d41a42cd4baacb5ee61d.scn"
[deps]
source_file="res://Models/Props/SM_Prop_Pillar_Broken_02.fbx"
dest_files=["res://.godot/imported/SM_Prop_Pillar_Broken_02.fbx-6e0d22869934d41a42cd4baacb5ee61d.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=2
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
import_script/path=""
_subresources={}
gltf/naming_version=1
gltf/embedded_image_handling=1

BIN
godot/Models/Props/SM_Prop_Pillar_Broken_Moss_01.fbx (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,49 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://sf2ippantsrx"
path="res://.godot/imported/SM_Prop_Pillar_Broken_Moss_01.fbx-8045d5a0178180db7d046a00e2fe0e73.scn"
[deps]
source_file="res://Models/Props/SM_Prop_Pillar_Broken_Moss_01.fbx"
dest_files=["res://.godot/imported/SM_Prop_Pillar_Broken_Moss_01.fbx-8045d5a0178180db7d046a00e2fe0e73.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=2
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
import_script/path=""
_subresources={
"materials": {
"lambert1": {
"use_external/enabled": true,
"use_external/path": "res://Models/Props/Materials/tree.tres"
}
},
"nodes": {
"PATH:RootNode/SM_Prop_Pillar_Broken_Moss_01": {
"generate/physics": true,
"physics/shape_type": 3,
"primitive/position": Vector3(0, 0.23, 0),
"primitive/size": Vector3(1.5, 0.5, 0.5)
}
}
}
gltf/naming_version=1
gltf/embedded_image_handling=1

BIN
godot/Models/Props/SM_Prop_StoneWall_01.fbx (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,50 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://up6utdya5pxh"
path="res://.godot/imported/SM_Prop_StoneWall_01.fbx-ec14bc38e13460abbdadf2e82e615315.scn"
[deps]
source_file="res://Models/Props/SM_Prop_StoneWall_01.fbx"
dest_files=["res://.godot/imported/SM_Prop_StoneWall_01.fbx-ec14bc38e13460abbdadf2e82e615315.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=2
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
import_script/path=""
_subresources={
"materials": {
"lambert1": {
"use_external/enabled": true,
"use_external/path": "res://Models/Props/Materials/tree.tres"
}
},
"nodes": {
"PATH:RootNode/SM_Prop_StoneWall_01": {
"generate/occluder": 1,
"generate/physics": true,
"physics/shape_type": 3,
"primitive/position": Vector3(-2.45, 0.5, 0),
"primitive/size": Vector3(5, 1, 0.5)
}
}
}
gltf/naming_version=1
gltf/embedded_image_handling=1

BIN
godot/Models/Props/SM_Rock_Wall_01.fbx (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,46 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://55s1at5inmv3"
path="res://.godot/imported/SM_Rock_Wall_01.fbx-b26d79bc3a10badfba16c63704ddf5ad.scn"
[deps]
source_file="res://Models/Props/SM_Rock_Wall_01.fbx"
dest_files=["res://.godot/imported/SM_Rock_Wall_01.fbx-b26d79bc3a10badfba16c63704ddf5ad.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=2
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
import_script/path=""
_subresources={
"materials": {
"lambert1": {
"use_external/enabled": true,
"use_external/path": "res://Models/Props/Materials/tree.tres"
}
},
"nodes": {
"PATH:RootNode/SM_Rock_Wall_01": {
"generate/physics": true
}
}
}
gltf/naming_version=1
gltf/embedded_image_handling=1

Binary file not shown.

BIN
godot/Models/Props/SM_Tree_Dead_02.fbx (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,54 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://dsym0ndxgp01"
path="res://.godot/imported/SM_Tree_Dead_02.fbx-231c3227f3383a53253500523c24c67f.scn"
[deps]
source_file="res://Models/Props/SM_Tree_Dead_02.fbx"
dest_files=["res://.godot/imported/SM_Tree_Dead_02.fbx-231c3227f3383a53253500523c24c67f.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=2
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
import_script/path=""
_subresources={
"materials": {
"Leaves_Dead": {
"use_external/enabled": true,
"use_external/path": "res://Models/Props/Materials/dead_branch.tres"
},
"Trunk": {
"use_external/enabled": true,
"use_external/path": "res://Models/Props/Materials/tree.tres"
}
},
"nodes": {
"PATH:RootNode/SM_Tree_Dead_02": {
"generate/physics": true,
"physics/shape_type": 5,
"primitive/height": 2.5,
"primitive/position": Vector3(0, 1, 0),
"primitive/radius": 0.1
}
}
}
gltf/naming_version=1
gltf/embedded_image_handling=1

Binary file not shown.

BIN
godot/Models/Props/Textures/Fern_Texture.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,35 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b20jr1o15h27s"
path.s3tc="res://.godot/imported/Fern_Texture.png-86b4cb03c2c27f7527d581a46603d050.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://Models/Props/Textures/Fern_Texture.png"
dest_files=["res://.godot/imported/Fern_Texture.png-86b4cb03c2c27f7527d581a46603d050.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

BIN
godot/Models/Props/Textures/Leaves_Generic_Texture.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,35 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://by5ltkdaer7j6"
path.s3tc="res://.godot/imported/Leaves_Generic_Texture.png-311e783912e6bbc47ac787ecf9214db4.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://Models/Props/Textures/Leaves_Generic_Texture.png"
dest_files=["res://.godot/imported/Leaves_Generic_Texture.png-311e783912e6bbc47ac787ecf9214db4.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

BIN
godot/Models/Props/Textures/PolygonNature_01.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,35 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://dhwwd6tpuq1ml"
path.s3tc="res://.godot/imported/PolygonNature_01.png-8d601fd201fc6b24886820c962502976.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://Models/Props/Textures/PolygonNature_01.png"
dest_files=["res://.godot/imported/PolygonNature_01.png-8d601fd201fc6b24886820c962502976.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

BIN
godot/Models/Props/Textures/PolygonNature_02.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bv802p28ssvqo"
path="res://.godot/imported/PolygonNature_02.png-e9db27c2393a982a3232b81c9cc741c9.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Models/Props/Textures/PolygonNature_02.png"
dest_files=["res://.godot/imported/PolygonNature_02.png-e9db27c2393a982a3232b81c9cc741c9.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
godot/Models/Props/Textures/PolygonNature_03.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://b5ol3toskc3dh"
path="res://.godot/imported/PolygonNature_03.png-9715575ff52cabf3507c5bbef82a3294.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Models/Props/Textures/PolygonNature_03.png"
dest_files=["res://.godot/imported/PolygonNature_03.png-9715575ff52cabf3507c5bbef82a3294.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
godot/Models/Props/Textures/PolygonNature_04.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://hy8b8j1no6lt"
path="res://.godot/imported/PolygonNature_04.png-613b4239645126b79551b017646b9c90.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Models/Props/Textures/PolygonNature_04.png"
dest_files=["res://.godot/imported/PolygonNature_04.png-613b4239645126b79551b017646b9c90.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
godot/Models/Props/Textures/Tree_Dead_Branch.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,35 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bd3tuw71coag3"
path.s3tc="res://.godot/imported/Tree_Dead_Branch.png-177f89f0172411ce5694549c7775e467.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://Models/Props/Textures/Tree_Dead_Branch.png"
dest_files=["res://.godot/imported/Tree_Dead_Branch.png-177f89f0172411ce5694549c7775e467.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

BIN
godot/Models/Sky/MountainSkybox.fbx (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,41 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://vgxi3xp3ces5"
path="res://.godot/imported/MountainSkybox.fbx-b3fa7236421d2ee9a0de566dab23ed3f.scn"
[deps]
source_file="res://Models/Sky/MountainSkybox.fbx"
dest_files=["res://.godot/imported/MountainSkybox.fbx-b3fa7236421d2ee9a0de566dab23ed3f.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
import_script/path=""
_subresources={
"materials": {
"lambert1": {
"use_external/enabled": true,
"use_external/path": "res://Models/Sky/sky.tres"
}
}
}
gltf/naming_version=1
gltf/embedded_image_handling=1

BIN
godot/Models/Sky/Skybox_Diff.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,35 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://fd8740pp6c65"
path.s3tc="res://.godot/imported/Skybox_Diff.png-7540f2719dd0664056e8a8c9082d3027.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://Models/Sky/Skybox_Diff.png"
dest_files=["res://.godot/imported/Skybox_Diff.png-7540f2719dd0664056e8a8c9082d3027.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=0

BIN
godot/Models/Sky/Skybox_No_Snow_Diff.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://daxuhceq1xp8e"
path="res://.godot/imported/Skybox_No_Snow_Diff.png-4aac1df060d706f7f84d7e011badea7b.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Models/Sky/Skybox_No_Snow_Diff.png"
dest_files=["res://.godot/imported/Skybox_No_Snow_Diff.png-4aac1df060d706f7f84d7e011badea7b.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

BIN
godot/Models/Sky/Skybox_Normal.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cbgfiq60qi04y"
path="res://.godot/imported/Skybox_Normal.png-0298afdd81d923bbadde428f4cf9fcc0.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Models/Sky/Skybox_Normal.png"
dest_files=["res://.godot/imported/Skybox_Normal.png-0298afdd81d923bbadde428f4cf9fcc0.ctex"]
[params]
compress/mode=0
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
process/fix_alpha_border=true
process/premult_alpha=false
process/normal_map_invert_y=false
process/hdr_as_srgb=false
process/hdr_clamp_exposure=false
process/size_limit=0
detect_3d/compress_to=1

View File

@ -0,0 +1,7 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://bmmdcphiyb35f"]
[ext_resource type="Texture2D" uid="uid://fd8740pp6c65" path="res://Models/Sky/Skybox_Diff.png" id="1_mcq4h"]
[resource]
transparency = 1
albedo_texture = ExtResource("1_mcq4h")

BIN
godot/Models/Weapons/SM_Prop_Sword_01.fbx (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,41 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://b0xxc2h5fgtpm"
path="res://.godot/imported/SM_Prop_Sword_01.fbx-bcf24ec78f44a339d13c7f93d8b8c416.scn"
[deps]
source_file="res://Models/Weapons/SM_Prop_Sword_01.fbx"
dest_files=["res://.godot/imported/SM_Prop_Sword_01.fbx-bcf24ec78f44a339d13c7f93d8b8c416.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/apply_root_scale=true
nodes/root_scale=1.0
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=false
animation/remove_immutable_tracks=true
import_script/path=""
_subresources={
"materials": {
"lambert4SG2": {
"use_external/enabled": true,
"use_external/path": "res://Models/Weapons/sword.tres"
}
}
}
gltf/naming_version=1
gltf/embedded_image_handling=1

View File

@ -0,0 +1,6 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://ctst7ps33k0aj"]
[ext_resource type="Texture2D" uid="uid://dg1l3p37suwt3" path="res://Models/Environments/Textures/PolygonPrototype_Texture_04.png" id="1_yk1ky"]
[resource]
albedo_texture = ExtResource("1_yk1ky")

File diff suppressed because it is too large Load Diff

View File

@ -1,12 +1,16 @@
#include "game_mode.hpp" #include "game_mode.hpp"
#include <optional> #include <optional>
#include "godot_cpp/variant/utility_functions.hpp" #include "godot_cpp/variant/utility_functions.hpp"
#include "godot_cpp/classes/viewport.hpp"
#include "godot_macros.h" #include "godot_macros.h"
#include "level.hpp" #include "level.hpp"
#include "player.hpp" #include "player.hpp"
namespace godot { namespace godot {
GameMode* GameMode::static_instance{nullptr}; GameMode *GameMode::static_instance{nullptr};
GameMode *GameMode::get_singleton() { return GameMode::static_instance; }
bool GameMode::has_singleton() { return GameMode::static_instance != nullptr; }
void GameMode::_bind_methods() { void GameMode::_bind_methods() {
#define CLASSNAME GameMode #define CLASSNAME GameMode

View File

@ -31,6 +31,9 @@ public:
void load_level(Ref<PackedScene>& levelScene, void load_level(Ref<PackedScene>& levelScene,
std::optional<String> entrance); std::optional<String> entrance);
static GameMode *get_singleton();
static bool has_singleton();
Player* get_player_instance() const; Player* get_player_instance() const;
void set_first_level(Ref<PackedScene> level); void set_first_level(Ref<PackedScene> level);

View File

@ -1,8 +1,10 @@
#include "player.hpp" #include "player.hpp"
#include <utility> #include <utility>
#include "game_mode.hpp"
#include "godot_cpp/classes/animation_tree.hpp" #include "godot_cpp/classes/animation_tree.hpp"
#include "godot_cpp/classes/node3d.hpp" #include "godot_cpp/classes/node3d.hpp"
#include "godot_cpp/classes/skeleton3d.hpp" #include "godot_cpp/classes/skeleton3d.hpp"
#include "godot_cpp/variant/utility_functions.hpp"
#include "godot_macros.h" #include "godot_macros.h"
namespace godot { namespace godot {
@ -11,109 +13,131 @@ void Player::_bind_methods() {
#ifndef NDEBUG #ifndef NDEBUG
GDPROPERTY(active_customization, Variant::DICTIONARY); GDPROPERTY(active_customization, Variant::DICTIONARY);
#endif #endif
GDFUNCTION_ARGS(on_horizontal, "event", "value");
GDFUNCTION_ARGS(on_vertical, "event", "value");
} }
void Player::_enter_tree() { void Player::_enter_tree() {
this->model = this->get_node<Node3D>("Model"); this->model = this->get_node<Node3D>("Model");
this->animTree = this->get_node<AnimationTree>("AnimationTree"); this->animTree = this->get_node<AnimationTree>("AnimationTree");
this->customization_init(); GDGAMEONLY();
this->input = this->get_node<PlayerInput>("PlayerInput");
} }
void Player::_exit_tree() { void Player::_ready() {
// free the customization options that were removed from the tree this->customization_init();
for(std::pair<const String, CustomizationState>& pair: this->customization) { GDGAMEONLY();
for(Node3D *option: pair.second.options) { this->input->listen_to(PlayerInput::Listener("move_left", "move_right", this, "on_horizontal"));
if(!option->is_inside_tree()) { this->input->listen_to(PlayerInput::Listener("move_forward", "move_back", this, "on_vertical"));
option->queue_free();
}
}
}
} }
void Player::_process(double deltaTime) {} void Player::_process(double deltaTime) {}
void Player::_physics_process(double deltaTime) {} void Player::_physics_process(double deltaTime) {}
void Player::select_customization(String category, std::optional<size_t> index) { void Player::set_customization_active(Node3D *node, bool active) {
if(this->customization.find(category) == this->customization.end()) node->set_visible(active);
node->set_process(active);
}
void Player::on_horizontal(Ref<InputEvent> event, float value) {
this->moveInput.x = value;
}
void Player::on_vertical(Ref<InputEvent> event, float value) {
this->moveInput.y = value;
}
void Player::select_customization(String category,
std::optional<size_t> index) {
if (this->customization.find(category) == this->customization.end())
return; return;
CustomizationState &pair = this->customization.at(category); CustomizationState& pair = this->customization.at(category);
// invalid keys are stored as the size of the array // invalid keys are stored as the size of the array
if(index.has_value() && index.value() > pair.options.size()) if (index.has_value() && index.value() > pair.options.size())
index = std::nullopt; index = std::nullopt;
// nothing changes // nothing changes
if(index == pair.currentSelected) if (index == pair.currentSelected)
return; return;
// disable previous chosen option, if any // disable previous chosen option, if any
if(pair.currentSelected.has_value()) if (pair.currentSelected.has_value())
customizationParent->remove_child(pair.options.at(pair.currentSelected.value())); Player::set_customization_active(pair.options.at(pair.currentSelected.value()), false);
// enable chosen option, if any // enable chosen option, if any
if(index.has_value()) if (index.has_value())
customizationParent->add_child(pair.options.at(index.value())); Player::set_customization_active(pair.options.at(index.value()), false);
pair.currentSelected = index; pair.currentSelected = index;
} }
Dictionary Player::get_active_customization() const { Dictionary Player::get_active_customization() const {
Dictionary result{}; Dictionary result{};
// translate the map to a dictionary of keys and indexes // translate the map to a dictionary of keys and indexes
for(std::pair<String, CustomizationState> const &pair: this->customization) for (std::pair<String, CustomizationState> const& pair :
this->customization)
result[pair.first] = pair.second.currentSelected.has_value() result[pair.first] = pair.second.currentSelected.has_value()
? pair.second.currentSelected.value() ? pair.second.currentSelected.value()
: -1; // an invalid key will always be -1 : -1; // an invalid key will always be -1
return result; return result;
} }
void Player::set_active_customization(Dictionary value) { void Player::set_active_customization(Dictionary value) {
for(size_t i = 0; i < value.size(); ++i) { for (size_t i = 0; i < value.size(); ++i) {
String key = value.keys()[i]; String key = value.keys()[i];
size_t selection = value[key]; size_t selection = value[key];
bool exists = this->customization.find(key) != this->customization.end(); // wether or not the a given key exists in the customization map // wether or not the a given key exists in the customization map
// if not, it can be added, as long as the customization map has not yet been initialized by _enter_tree bool exists = this->customization.find(key) != this->customization.end();
if(!exists && !this->is_inside_tree()) // if not, it can be added, as long as the customization map has not yet
// been initialized by _ready
if (!exists && !this->is_inside_tree())
this->customization.insert({key, {std::optional{selection}, {}}}); this->customization.insert({key, {std::optional{selection}, {}}});
// if the key does not exist in customization and _enter_tree is already called, the key is not valid and discarted // if the key does not exist in customization and _ready is already
else if(!exists) // called, the key is not valid and discarted
else if (!exists)
return; return;
else else
this->select_customization(key, selection >= 0 ? std::optional{selection} : std::nullopt); this->select_customization(
key, selection >= 0 ? std::optional{selection} : std::nullopt);
} }
} }
void Player::customization_init() { void Player::customization_init() {
this->customizationParent = this->get_node<Skeleton3D>("Model/RootNode/Skeleton3D"); this->customizationParent =
if(!this->customizationParent) this->get_node<Skeleton3D>("Model/RootNode/GeneralSkeleton");
if (this->customizationParent == nullptr)
return; return;
for(int i = 0; i < customizationParent->get_child_count(); ++i) { for (int i = 0; i < customizationParent->get_child_count(); ++i) {
// get the next valid child // get the next valid child
Node3D *child = Object::cast_to<Node3D>(this->customizationParent->get_child(i)); Node3D* child = Object::cast_to<Node3D>(this->customizationParent->get_child(i));
if(!child) continue; if (child == nullptr)
continue;
// split it's name into parts based on _ // split it's name into parts based on _
// the format for the names will be Chr_<CATEGORY NAME>_<ADDITIONAL IDENTIFIERS>_<NUMBER> // the format for the names will be Chr_<CATEGORY NAME>_<ADDITIONAL IDENTIFIERS>_<NUMBER> numbering IS NOT guaranteed to start at 0 OR 1
// numbering IS NOT guaranteed to start at 0 OR 1
// the category name will serve as the key to the customization map // the category name will serve as the key to the customization map
// additional identifiers are ignored // additional identifiers are ignored
PackedStringArray slices = child->get_name().split("_", false); PackedStringArray slices = child->get_name().split("_", false);
// create a new customization state if one does not exist for this category // create a new customization state if one does not exist for this category
if(this->customization.find(slices[1]) == this->customization.end()) if (this->customization.find(slices[1]) == this->customization.end())
this->customization.insert({slices[1], {std::optional{0}, {}}}); this->customization.insert({slices[1], {std::optional{0}, {}}});
// add the new child to the customization options for this category // add the new child to the customization options for this category
CustomizationState &state = this->customization.at(slices[1]); CustomizationState& state = this->customization.at(slices[1]);
state.options.push_back(child); state.options.push_back(child);
// only allow this child to exist in the scene tree if it was saved as the current selection // set invisible if this child is not the current selection
if(state.currentSelected != state.options.size()-1) { if (state.currentSelected != state.options.size() - 1) {
this->customizationParent->remove_child(child); Player::set_customization_active(child, false);
--i;
} }
} }
// collect customization categories that do not contain any options // collect customization categories that do not contain any options
std::vector<String> empty{}; std::vector<String> empty{};
for(std::pair<const String, CustomizationState>& pair: this->customization) { for (std::pair<const String, CustomizationState>& pair :
if(pair.second.options.size() == 0) this->customization) {
if (pair.second.options.size() == 0)
empty.push_back(pair.first); empty.push_back(pair.first);
if(pair.second.currentSelected.has_value() && pair.second.currentSelected.value() > pair.second.options.size()) if (pair.second.currentSelected.has_value() &&
pair.second.currentSelected.value() > pair.second.options.size())
pair.second.currentSelected = std::nullopt; pair.second.currentSelected = std::nullopt;
UtilityFunctions::print("- ", pair.first);
} }
// remove collected empty categories // remove collected empty categories
for(String const& key: empty) { for (String const& key : empty) {
this->customization.erase(key); this->customization.erase(key);
UtilityFunctions::print("removing ", key);
} }
} }
} // namespace godot } // namespace godot

View File

@ -4,7 +4,9 @@
#include <map> #include <map>
#include "godot_cpp/classes/animation_tree.hpp" #include "godot_cpp/classes/animation_tree.hpp"
#include "godot_cpp/classes/character_body3d.hpp" #include "godot_cpp/classes/character_body3d.hpp"
#include "godot_cpp/classes/input_event.hpp"
#include "godot_cpp/classes/skeleton3d.hpp" #include "godot_cpp/classes/skeleton3d.hpp"
#include "player_input.hpp"
#include <optional> #include <optional>
namespace godot { namespace godot {
@ -26,13 +28,23 @@ protected:
AnimationTree* animTree{nullptr}; AnimationTree* animTree{nullptr};
// the skeleton of the customizable character model // the skeleton of the customizable character model
Skeleton3D *customizationParent{nullptr}; Skeleton3D *customizationParent{nullptr};
PlayerInput *input{nullptr};
float walkSpeed{10.f};
Vector2 moveInput{0.f, 0.f};
public: public:
virtual void _enter_tree() override; virtual void _enter_tree() override;
virtual void _exit_tree() override; virtual void _ready() override;
virtual void _process(double deltaTime) override; virtual void _process(double deltaTime) override;
virtual void _physics_process(double deltaTime) override; virtual void _physics_process(double deltaTime) override;
static void set_customization_active(Node3D *node, bool active);
void on_horizontal(Ref<InputEvent> event, float value);
void on_vertical(Ref<InputEvent> event, float value);
// Swap out the currently active customization for this category // Swap out the currently active customization for this category
void select_customization(String category, std::optional<size_t> value); void select_customization(String category, std::optional<size_t> value);
// Construct a dictionary of [String, int] where the key is a category // Construct a dictionary of [String, int] where the key is a category

63
src/player_input.cpp Normal file
View File

@ -0,0 +1,63 @@
#include "player_input.hpp"
#include "godot_macros.h"
#include "godot_cpp/classes/input.hpp"
#include "godot_cpp/classes/input_event.hpp"
#include <algorithm>
namespace godot {
void PlayerInput::_bind_methods() {}
PlayerInput::Listener::Listener(String positive, String negative, Node *object, String method)
: actionNegative{negative}
, actionPositive{positive}
, methodName{method}
, object{object} {}
bool PlayerInput::Listener::has_changed(Ref<InputEvent> const &event) {
return event->is_action(this->actionNegative) || event->is_action(this->actionPositive);
}
float PlayerInput::Listener::evaluate(Ref<InputEvent> const &event) {
float newest = static_cast<float>(event->is_action_pressed(this->actionPositive))
- static_cast<float>(event->is_action_pressed(this->actionNegative));
if(lastCached != newest)
this->object->call(this->methodName, event, newest);
return (lastCached = newest);
}
bool PlayerInput::Listener::operator==(godot::PlayerInput::Listener const& b) {
return this->methodName == b.methodName
&& this->object == b.object
&& this->actionNegative == b.actionNegative
&& this->actionPositive == b.actionPositive;
}
void PlayerInput::_unhandled_input(Ref<InputEvent> const &event) {
GDGAMEONLY();
for(Listener& listener: this->listeners) {
if(listener.has_changed(event)) {
listener.evaluate(event);
}
}
}
void PlayerInput::listen_to(Listener const& listener) {
this->listeners.push_back(listener);
}
void PlayerInput::stop_listening(Node *node) {
for(size_t i = 0; i < this->listeners.size(); ++i) {
Listener& l = this->listeners.at(i);
if(l.object == node) {
this->listeners.erase(this->listeners.begin() + i);
i--;
}
}
}
void PlayerInput::stop_listening(Listener const& listener) {
std::vector<Listener>::iterator itr = std::find(this->listeners.begin(), this->listeners.end(), listener);
if(itr != this->listeners.end())
this->listeners.erase(itr);
}
}

37
src/player_input.hpp Normal file
View File

@ -0,0 +1,37 @@
#ifndef PLAYER_INPUT_HPP
#define PLAYER_INPUT_HPP
#include <vector>
#include "godot_cpp/classes/input_event.hpp"
#include "godot_cpp/classes/node.hpp"
namespace godot {
class PlayerInput : public Node {
GDCLASS(PlayerInput, Node)
static void _bind_methods();
public:
struct Listener {
String actionNegative{""};
String actionPositive{""};
float lastCached{0.f};
String methodName{""};
Node *object;
Listener(String positive, String negative, Node *object, String method);
bool has_changed(Ref<InputEvent> const &event);
float evaluate(Ref<InputEvent> const &event);
bool operator==(godot::PlayerInput::Listener const& b);
};
private:
std::vector<Listener> listeners;
public:
virtual void _unhandled_input(Ref<InputEvent> const &event) override;
void listen_to(Listener const& listener);
void stop_listening(Node *node);
void stop_listening(Listener const& listener);
};
}
#endif // !PLAYER_INPUT_HPP

View File

@ -8,6 +8,7 @@
#include "game_mode.hpp" #include "game_mode.hpp"
#include "level.hpp" #include "level.hpp"
#include "player.hpp" #include "player.hpp"
#include "player_input.hpp"
using namespace godot; using namespace godot;
@ -19,6 +20,7 @@ void initialize_gdextension_types(ModuleInitializationLevel p_level) {
ClassDB::register_class<Level>(); ClassDB::register_class<Level>();
ClassDB::register_class<Entrance>(); ClassDB::register_class<Entrance>();
ClassDB::register_class<GameMode>(); ClassDB::register_class<GameMode>();
ClassDB::register_class<PlayerInput>();
} }
extern "C" { extern "C" {