Compare commits

..

15 Commits

56 changed files with 30272 additions and 478 deletions

View File

@ -24,9 +24,9 @@
inkscape:pagecheckerboard="0" inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1" inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm" inkscape:document-units="mm"
inkscape:zoom="0.93240622" inkscape:zoom="1.2579205"
inkscape:cx="1521.8689" inkscape:cx="1779.1267"
inkscape:cy="440.25875" inkscape:cy="525.47039"
inkscape:current-layer="layer1" inkscape:current-layer="layer1"
showgrid="false" showgrid="false"
inkscape:export-bgcolor="#ffffffff"><inkscape:page inkscape:export-bgcolor="#ffffffff"><inkscape:page
@ -44,7 +44,12 @@
id="page2" id="page2"
margin="0" margin="0"
bleed="0" /></sodipodi:namedview><defs bleed="0" /></sodipodi:namedview><defs
id="defs1"><marker id="defs1"><rect
x="335.80286"
y="583.50471"
width="211.20541"
height="99.346172"
id="rect2" /><marker
style="overflow:visible" style="overflow:visible"
id="marker126" id="marker126"
refX="0" refX="0"
@ -250,51 +255,51 @@
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="tspan10"><tspan id="tspan5"><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan2">Concept</tspan><tspan id="tspan1">Concept</tspan><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan9"> id="tspan4">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="60.32375" y="60.32375"
id="tspan12"><tspan id="tspan7"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan11">3D fixed camera dungeon crawler where the player is placed in a randomly selected sequence of rooms id="tspan6">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="tspan15"><tspan id="tspan12"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan13">and asked to clear as many rooms as possible within a 5min timeframe. id="tspan11">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="tspan17"><tspan id="tspan15"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan16"> id="tspan13">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="108.32375" y="108.32375"
id="tspan19"><tspan id="tspan17"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan18">The environments are an overgrown forest ruin made using a combination of the Nature pack and Prototype assets. id="tspan16">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="tspan21"><tspan id="tspan19"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan20"> id="tspan18">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="140.32375" y="140.32375"
id="tspan25"><tspan id="tspan25"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan22">The </tspan><tspan id="tspan20">The </tspan><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan23">player</tspan><tspan id="tspan21">player</tspan><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan24"> can move horizontally with the Joystick or WASD. The player has two weapons which id="tspan22"> 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"
@ -324,7 +329,7 @@
y="220.32375" y="220.32375"
id="tspan35"><tspan id="tspan35"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan34"> id="tspan34">The player can gather score by picking up coins, advancing to the next room, or defeating enemies.
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="236.32375" y="236.32375"
@ -346,300 +351,300 @@
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="284.32375" y="284.32375"
id="tspan44"><tspan id="tspan46"><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan42">&quot;Fodder&quot;</tspan><tspan id="tspan44">&quot;Fodder&quot;</tspan><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan43"> that are slow and die easilly, but if they do end up hitting you they hurt a lot. id="tspan45"> 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="tspan46"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan45">
</tspan></tspan><tspan
x="31.84375"
y="316.32375"
id="tspan48"><tspan id="tspan48"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan47"> id="tspan47">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="332.32375" y="316.32375"
id="tspan50"><tspan id="tspan50"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan49"> id="tspan49">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="348.32375" y="332.32375"
id="tspan52"><tspan id="tspan52"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan51"> id="tspan51">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="364.32375" y="348.32375"
id="tspan55"><tspan id="tspan56"><tspan
style="font-weight:bold"
id="tspan53">&quot;Tanks&quot;</tspan><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan54"> which don't hit very hard but survive for longer. id="tspan55">
</tspan></tspan><tspan
x="31.84375"
y="364.32375"
id="tspan59"><tspan
style="font-weight:bold"
id="tspan57">&quot;Tanks&quot;</tspan><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan58"> 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="tspan57"><tspan id="tspan62"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan56"> id="tspan61">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="396.32375" y="396.32375"
id="tspan59"><tspan id="tspan65"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan58"> id="tspan64">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="412.32375" y="412.32375"
id="tspan61"><tspan id="tspan67"><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan60"> id="tspan66">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="428.32375" y="428.32375"
id="tspan64"><tspan id="tspan70"><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan62">&quot;Ranged&quot;</tspan><tspan id="tspan68">&quot;Ranged&quot;</tspan><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan63"> which, like fodder have low health, low speed, and like the tank low damage, but can hit from a range. id="tspan69"> 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="tspan66"><tspan id="tspan72"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan65"> id="tspan71">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="460.32375" y="460.32375"
id="tspan68"><tspan id="tspan74"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan67"> id="tspan73">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="476.32375" y="476.32375"
id="tspan70"><tspan id="tspan76"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan69"> id="tspan75">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="492.32375" y="492.32375"
id="tspan72"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
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"
y="508.32375"
id="tspan74"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan73">leaves the player unable to act for a second.
</tspan></tspan><tspan
x="31.84375"
y="524.32375"
id="tspan76"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
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
x="31.84375"
y="540.32375"
id="tspan78"><tspan id="tspan78"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan77"> id="tspan77">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
</tspan></tspan><tspan
x="31.84375" x="31.84375"
y="556.32375" y="508.32375"
id="tspan80"><tspan id="tspan80"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
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 id="tspan79">leaves the player unable to act for a second. Meaning that if the player fails to clear the room in the &quot;berserk&quot; time, they'll take a lot of </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="572.32375" y="524.32375"
id="tspan84"><tspan id="tspan84"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan81">leaving a small amount to avoid frustrating deaths).</tspan></tspan></text><text id="tspan81">hits. There is also a &quot;speedup&quot; powerup, which will increase the animation/movement speed for the player but drains health while </tspan></tspan><tspan
x="31.84375"
y="540.32375"
id="tspan140"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan139">active (always leaving a small amount to avoid frustrating deaths). Finally there's an explosion powerup, which will create a big </tspan></tspan><tspan
x="31.84375"
y="556.32375"
id="tspan142"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan141">explosion around the player, killing a lot of enemies in one swoop. But enemies that are still alive after it will be stronger.</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="tspan87"><tspan id="tspan150"><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan85">Player: id="tspan143">Player:
</tspan></tspan><tspan </tspan></tspan><tspan
x="1205.7305" x="1205.7305"
y="87.800313" y="87.800313"
id="tspan88">- A warrior with an axe and a sword. id="tspan153">- 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="tspan89"> id="tspan154">
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="119.80031" y="119.80031"
id="tspan91"><tspan id="tspan156"><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan90">Objectives: id="tspan155">Objectives:
</tspan></tspan><tspan </tspan></tspan><tspan
x="1205.7305" x="1205.7305"
y="135.80031" y="135.80031"
id="tspan94">- Defeat all enemies.<tspan id="tspan158">- Defeat all enemies.<tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan93"> id="tspan157">
</tspan></tspan><tspan </tspan></tspan><tspan
x="1205.7305" x="1205.7305"
y="151.80031" y="151.80031"
id="tspan95">- Move to the next room. id="tspan159">- Move to the next room.
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="167.80031" y="167.80031"
id="tspan96"> id="tspan160">
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="183.80031" y="183.80031"
id="tspan99"><tspan id="tspan162"><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan98">Resources: id="tspan161">Resources:
</tspan></tspan><tspan </tspan></tspan><tspan
x="1205.7305" x="1205.7305"
y="199.80031" y="199.80031"
id="tspan100">- Health, depending on what they get hit by, the player can take 4-7 hits id="tspan163">- 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="tspan101">- Time, 5 minutes id="tspan164">- Time, 5 minutes
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="231.80031" y="231.80031"
id="tspan102"> id="tspan165">
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="247.80031" y="247.80031"
id="tspan104"><tspan id="tspan167"><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan103">Mechanics: id="tspan166">Mechanics:
</tspan></tspan><tspan </tspan></tspan><tspan
x="1205.7305" x="1205.7305"
y="263.80031" y="263.80031"
id="tspan105">- Short/light/weak attack with the axe id="tspan168">- Short/light/weak attack with the axe
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="279.80031" y="279.80031"
id="tspan106">- Long/heavy/strong attack with the sword id="tspan169">- Long/heavy/strong attack with the sword
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="295.80031" y="295.80031"
id="tspan108">- Berserk powerup that has a long vulnerablility period at the end id="tspan170">- 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="tspan109">- Speed powerup that saps in the ballpark of 30% of the player's max health id="tspan171">- 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="tspan110">- The game timer ticks down to game over id="tspan172">- Explosion Powerup that clears a large number of enemies but powers up those that survive
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="343.80031" y="343.80031"
id="tspan111">- Rooms will spawn enemies in randomly selected waves. id="tspan173">- The game timer ticks down to game over
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="359.80031" y="359.80031"
id="tspan112">- Progress requires killing all waves of enemies id="tspan174">- Rooms will spawn enemies in randomly selected waves.
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="375.80031" y="375.80031"
id="tspan113"> id="tspan175">- Progress requires killing all waves of enemies
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="391.80031" y="391.80031"
id="tspan116"><tspan id="tspan176">
style="font-weight:bold"
id="tspan114">Dynamics:
</tspan></tspan><tspan
x="1205.7305"
y="407.80031"
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"
y="407.80031"
id="tspan178"><tspan
style="font-weight:bold"
id="tspan177">Dynamics:
</tspan></tspan><tspan
x="1205.7305" x="1205.7305"
y="423.80031" y="423.80031"
id="tspan118"> - deciding to use a long when you shouldn't would lead to getting hit during windup (canceling the action) or during winddown. id="tspan179">- 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="439.80031" y="439.80031"
id="tspan119"> - But a light attack could fail to eliminate a threat in time. id="tspan180"> - 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="455.80031" y="455.80031"
id="tspan120">- The player can make heavy attacks more useful by finding a speedup, but that goes at the cost of health. id="tspan181"> - But a light attack could fail to eliminate a threat in time.
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="471.80031" y="471.80031"
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. id="tspan182">- 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="487.80031" y="487.80031"
id="tspan122"> id="tspan183">- 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="503.80031" y="503.80031"
id="tspan124"><tspan id="tspan184">- In a panic the player can use the explosion powerup, but if used carelessly this will make the game harder
style="font-weight:bold"
id="tspan123">Conflict:</tspan>
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="519.80031" y="519.80031"
id="tspan125">- The player cannot progress without defeating enemies. id="tspan185">
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="535.80031" y="535.80031"
id="tspan126">- The enemies will attack the player. id="tspan187"><tspan
style="font-weight:bold"
id="tspan186">Conflict:</tspan>
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="551.80031" y="551.80031"
id="tspan127"> id="tspan188">- The player cannot progress without defeating enemies.
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="567.80031" y="567.80031"
id="tspan129"><tspan id="tspan189">- The enemies will attack the player.
style="font-weight:bold" </tspan><tspan
id="tspan128">Boundaries:
</tspan></tspan><tspan
x="1205.7305" x="1205.7305"
y="583.80031" y="583.80031"
id="tspan130">- The player cannot leave the room they're in until all enemies are defeated. id="tspan190">
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="599.80031" y="599.80031"
id="tspan131">- The player cannot stop an attack until it's animation is finished. id="tspan192"><tspan
</tspan><tspan style="font-weight:bold"
id="tspan191">Boundaries:
</tspan></tspan><tspan
x="1205.7305" x="1205.7305"
y="615.80031" y="615.80031"
id="tspan132"> id="tspan193">- 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="631.80031" y="631.80031"
id="tspan134"><tspan id="tspan194">- The player cannot stop an attack until it's animation is finished.
style="font-weight:bold"
id="tspan133">Outcome:
</tspan></tspan><tspan
x="1205.7305"
y="647.80031"
id="tspan136">- The game ends when the player runs out of time or health<tspan
style="font-weight:bold"
id="tspan135">
</tspan></tspan><tspan
x="1205.7305"
y="663.80031"
id="tspan137">- The player is scored based on the number of enemies defeated
</tspan><tspan </tspan><tspan
x="1205.7305"
y="647.80031"
id="tspan195">
</tspan><tspan
x="1205.7305"
y="663.80031"
id="tspan197"><tspan
style="font-weight:bold"
id="tspan196">Outcome:
</tspan></tspan><tspan
x="1205.7305" x="1205.7305"
y="679.80031" y="679.80031"
id="tspan138">- After the game end screen, the game is reset for the next person. </tspan></text><image id="tspan199">- The game ends when the player runs out of time or health<tspan
style="font-weight:bold"
id="tspan198">
</tspan></tspan><tspan
x="1205.7305"
y="695.80031"
id="tspan200">- The player is scored based on the number of enemies defeated
</tspan><tspan
x="1205.7305"
y="711.80031"
id="tspan201">- After the game end screen, the game is reset for the next person. </tspan></text><image
width="13.64728" width="13.64728"
height="27.455114" height="27.455114"
preserveAspectRatio="none" preserveAspectRatio="none"
@ -880,84 +885,9 @@
id="tspan82" id="tspan82"
style="fill:#000000;stroke:none;stroke-width:0.5" style="fill:#000000;stroke:none;stroke-width:0.5"
x="506.4968" x="506.4968"
y="46.607197">Four hits to death</tspan></text></g><rect y="46.607197">Four hits to death</tspan></text></g><g
style="fill:none;stroke:#000000;stroke-width:0.484569;stroke-linejoin:round"
id="rect82"
width="98.574799"
height="46.60043"
x="499.52936"
y="158.54077"
ry="2.7184379" /><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"
x="509.06833"
y="171.26752"
id="text83"><tspan
sodipodi:role="line"
id="tspan83"
style="fill:#000000;stroke:none;stroke-width:0.5"
x="509.06833"
y="171.26752">Next room</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"
x="559.08936"
y="171.39975"
id="text86"><tspan
sodipodi:role="line"
id="tspan86"
style="stroke-width:0.5"
x="559.08936"
y="171.39975">Defeat wave of enemies</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"
x="556.18872"
y="191.89928"
id="text88"><tspan
sodipodi:role="line"
style="stroke-width:0.5"
x="556.18872"
y="191.89928"
id="tspan97">Door/Gate/Some way to leave</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.5"
x="556.18872"
y="194.72151"
id="tspan107">opens</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"
x="510.16174"
y="191.89981"
id="text92"><tspan
sodipodi:role="line"
id="tspan92"
style="stroke-width:0.5"
x="510.16174"
y="191.89981">Walk through</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.5"
x="510.16174"
y="194.72205"
id="tspan115">door</tspan></text><path
style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker118)"
d="m 524.66566,169.07897 c 0,0 7.73173,-2.57985 17.21261,-2.32077 7.53053,0.20578 14.50393,3.28746 14.50393,3.28746"
id="path117"
sodipodi:nodetypes="csc" /><path
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker120)"
d="m 576.49022,175.07408 c 0,0 0.77324,3.09402 0.19344,6.76888 -0.54257,3.43887 -1.74047,5.99511 -1.74047,5.99511"
id="path119"
sodipodi:nodetypes="csc" /><path
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker122)"
d="m 553.47697,193.05942 c 0,0 -4.835,1.93389 -13.15088,1.93389 -8.31588,0 -11.21696,-1.93389 -11.21696,-1.93389"
id="path121" /><path
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker124)"
d="m 514.02488,188.61183 c 0,0 -1.5465,-1.93389 -1.73994,-6.57543 -0.19344,-4.64155 1.54651,-8.8962 1.54651,-8.8962"
id="path123"
sodipodi:nodetypes="csc" /><path
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"
id="path125" /><g
id="g5" id="g5"
transform="translate(21.068403,-44.544624)"><g transform="translate(-17.002033,-73.99137)"><g
id="g151" id="g151"
transform="translate(30.606929,3.6243846)"><g transform="translate(30.606929,3.6243846)"><g
id="g150" id="g150"
@ -1065,14 +995,115 @@
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></g></g><text y="136.34253">light</tspan></text></g></g><g
id="g6"
transform="translate(-313.65626,-5.4599291)"><rect
style="fill:none;stroke:#000000;stroke-width:0.484569;stroke-linejoin:round"
id="rect82"
width="98.574799"
height="46.60043"
x="501.6362"
y="158.34012"
ry="2.7184379" /><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"
x="511.17517"
y="171.06688"
id="text83"><tspan
sodipodi:role="line"
id="tspan83"
style="fill:#000000;stroke:none;stroke-width:0.5"
x="511.17517"
y="171.06688">Next room</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"
x="561.19617"
y="171.19911"
id="text86"><tspan
sodipodi:role="line"
id="tspan86"
style="stroke-width:0.5"
x="561.19617"
y="171.19911">Defeat wave of enemies</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"
x="558.29553"
y="191.69864"
id="text88"><tspan
sodipodi:role="line"
style="stroke-width:0.5"
x="558.29553"
y="191.69864"
id="tspan97">Door/Gate/Some way to leave</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.5"
x="558.29553"
y="194.52087"
id="tspan107">opens</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"
x="512.26855"
y="191.69917"
id="text92"><tspan
sodipodi:role="line"
id="tspan92"
style="stroke-width:0.5"
x="512.26855"
y="191.69917">Walk through</tspan><tspan
sodipodi:role="line"
style="stroke-width:0.5"
x="512.26855"
y="194.52141"
id="tspan115">door</tspan></text><path
style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker118)"
d="m 526.7725,168.87832 c 0,0 7.73173,-2.57985 17.21261,-2.32077 7.53053,0.20578 14.50393,3.28746 14.50393,3.28746"
id="path117"
sodipodi:nodetypes="csc" /><path
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker120)"
d="m 578.59706,174.87343 c 0,0 0.77324,3.09402 0.19344,6.76888 -0.54257,3.43887 -1.74047,5.99511 -1.74047,5.99511"
id="path119"
sodipodi:nodetypes="csc" /><path
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker122)"
d="m 555.58381,192.85877 c 0,0 -4.835,1.93389 -13.15088,1.93389 -8.31588,0 -11.21696,-1.93389 -11.21696,-1.93389"
id="path121" /><path
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker124)"
d="m 516.13172,188.41118 c 0,0 -1.5465,-1.93389 -1.73994,-6.57543 -0.19344,-4.64155 1.54651,-8.8962 1.54651,-8.8962"
id="path123"
sodipodi:nodetypes="csc" /><path
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker126)"
d="m 573.8952,168.17619 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" /><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="503.0347"
y="162.23825" y="162.0376"
id="text152"><tspan id="text152"><tspan
sodipodi:role="line" sodipodi:role="line"
id="tspan152" id="tspan152"
style="stroke-width:0.5" style="stroke-width:0.5"
x="500.92786" x="503.0347"
y="162.23825">Secondary Game Loop</tspan></text></g></svg> y="162.0376">Secondary Game Loop</tspan></text></g><image
width="76.243652"
height="50.02211"
preserveAspectRatio="none"
xlink:href="../../../../Pictures/Screenshots/2024-02-08_12-02-1707392481.png"
id="image1"
x="10.361387"
y="154.08205" /><image
width="13.64728"
height="26.568644"
preserveAspectRatio="none"
xlink:href="../../../../Pictures/Screenshots/2024-02-08_12-02-1707392500.png"
id="image1-9"
x="10.085637"
y="38.110359" /><text
xml:space="preserve"
transform="matrix(0.26458333,0,0,0.26458333,0,0.55744479)"
id="text2"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;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(#rect2);display:inline;fill:#4d4d4d;stroke:none;stroke-width:0.00000018;stroke-linejoin:round"><tspan
x="335.80273"
y="595.98391"
id="tspan202">Example of asset use and </tspan><tspan
x="335.80273"
y="611.98391"
id="tspan203">camera angle</tspan></text></g></svg>

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 47 KiB

@ -1 +1 @@
Subproject commit 460dc9a1c6bd2b077117db8f8884c36bb9eb9a02 Subproject commit d83a007fc547d7000ff4bc96e483322a9693fd1b

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=13 format=3 uid="uid://3qb27d8vkjku"] [gd_scene load_steps=18 format=3 uid="uid://3qb27d8vkjku"]
[ext_resource type="LightmapGIData" uid="uid://cfli7rodl51qd" path="res://Levels/Light/room001.lmbake" id="1_vp3o5"] [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"]
@ -9,6 +9,11 @@
[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://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://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"] [ext_resource type="PackedScene" uid="uid://vgxi3xp3ces5" path="res://Models/Sky/MountainSkybox.fbx" id="9_ypm82"]
[ext_resource type="PackedScene" uid="uid://hu8pchvhxwxn" path="res://Models/Environments/SM_Buildings_Door_01.fbx" id="10_dh3em"]
[ext_resource type="PackedScene" uid="uid://cgajq7ygn3aiy" path="res://Models/Environments/SM_Buildings_DoorFrame_01.fbx" id="11_pbt64"]
[ext_resource type="PackedScene" uid="uid://djx1fn3fntb3y" path="res://Models/Characters/Characters.fbx" id="12_0wtqw"]
[ext_resource type="PackedScene" uid="uid://c8h5f82tunglj" path="res://Models/Characters/ModularCharacters.fbx" id="13_n80tv"]
[ext_resource type="PackedScene" uid="uid://dw8q1vqnc657" path="res://player.tscn" id="14_cnw06"]
[sub_resource type="PhysicalSkyMaterial" id="PhysicalSkyMaterial_2kikw"] [sub_resource type="PhysicalSkyMaterial" id="PhysicalSkyMaterial_2kikw"]
@ -20,6 +25,7 @@ background_mode = 2
sky = SubResource("Sky_g8k5h") sky = SubResource("Sky_g8k5h")
ssil_enabled = true ssil_enabled = true
volumetric_fog_enabled = true volumetric_fog_enabled = true
volumetric_fog_density = 0.015
[node name="Level" type="Level"] [node name="Level" type="Level"]
@ -126,3 +132,219 @@ 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")] [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) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.568564, -0.711053, -0.05379)
[node name="Root Scene2" parent="." instance=ExtResource("11_pbt64")]
transform = Transform3D(0.866025, 0, 0.5, 0, 1, 0, -0.5, 0, 0.866025, -2.60823, -0.000884213, -3.75164)
[node name="Root Scene" parent="Root Scene2" instance=ExtResource("10_dh3em")]
transform = Transform3D(-0.213729, 0, 0.976893, 0, 1, 0, -0.976893, 0, -0.213729, -1.14452, 4.76837e-07, 0.143641)
[node name="Root Scene" parent="." instance=ExtResource("12_0wtqw")]
transform = Transform3D(0.510393, -0.859941, 0, -3.75892e-08, -2.231e-08, 1, -0.859941, -0.510393, -4.37114e-08, -1.89835, 0.0725416, 0.132563)
[node name="Skeleton3D" parent="Root Scene/RootNode" index="0"]
bones/2/rotation = Quaternion(0.99502, 0.0996789, -1.32247e-15, 7.09436e-17)
bones/3/rotation = Quaternion(0.995186, 0.0980028, 5.60143e-16, -5.62927e-16)
bones/4/rotation = Quaternion(0.99381, 0.11109, -3.91661e-17, -7.27518e-16)
bones/5/rotation = Quaternion(7.05397e-17, -1.30404e-15, -0.0417333, 0.999129)
bones/6/rotation = Quaternion(0.458571, 0.53825, -0.458571, 0.53825)
bones/9/rotation = Quaternion(0.578548, 0.632486, -0.352513, 0.375471)
bones/10/rotation = Quaternion(0.0113281, -0.23686, -0.0338065, 0.970889)
bones/12/rotation = Quaternion(-2.41562e-17, 0.0358308, -1.66793e-15, 0.999358)
bones/13/rotation = Quaternion(0.0254806, -0.276843, -0.0880396, 0.956534)
bones/14/rotation = Quaternion(-0.039942, 0.11784, -0.141636, 0.982068)
bones/15/rotation = Quaternion(-0.0364033, 0.152035, 0.229995, 0.960553)
bones/16/rotation = Quaternion(0.000280495, -0.0657944, -0.00425393, 0.997824)
bones/17/rotation = Quaternion(-0.00115399, 0.0107416, -0.0983299, 0.995095)
bones/18/rotation = Quaternion(-0.0069122, 0.0257174, -0.0570024, 0.998019)
bones/19/rotation = Quaternion(-0.00451965, 0.0280399, 0.159068, 0.986859)
bones/20/rotation = Quaternion(-0.00248643, 0.0438797, -0.0565193, 0.997434)
bones/21/rotation = Quaternion(0.00263727, -0.019492, -0.0212693, 0.99958)
bones/23/rotation = Quaternion(0.0166464, -0.0965253, 0.16913, 0.980714)
bones/24/rotation = Quaternion(0.632486, -0.578548, -0.375471, -0.352513)
bones/25/rotation = Quaternion(0.0113281, -0.23686, -0.0338065, 0.970889)
bones/27/rotation = Quaternion(-1.00832e-16, 0.0358308, 1.17227e-15, 0.999358)
bones/28/rotation = Quaternion(0.0254806, -0.276843, -0.0880396, 0.956534)
bones/29/rotation = Quaternion(-0.039942, 0.11784, -0.141636, 0.982068)
bones/30/rotation = Quaternion(-0.0364033, 0.152035, 0.229995, 0.960553)
bones/31/rotation = Quaternion(0.000280495, -0.0657944, -0.00425393, 0.997824)
bones/32/rotation = Quaternion(-0.00115399, 0.0107416, -0.0983299, 0.995095)
bones/33/rotation = Quaternion(-0.0069122, 0.0257174, -0.0570024, 0.998019)
bones/34/rotation = Quaternion(-0.00451965, 0.0280399, 0.159068, 0.986859)
bones/35/rotation = Quaternion(-0.00248643, 0.0438797, -0.0565193, 0.997434)
bones/36/rotation = Quaternion(0.00263727, -0.019492, -0.0212693, 0.99958)
bones/38/rotation = Quaternion(0.0166464, -0.0965253, 0.16913, 0.980714)
bones/39/rotation = Quaternion(-0.0417753, 0.705872, -0.70419, 0.0641594)
bones/40/rotation = Quaternion(0.644378, -0.0244627, 0.00473771, 0.764301)
bones/41/rotation = Quaternion(0.85767, -0.507213, -0.0397527, -0.0745436)
bones/42/rotation = Quaternion(-8.01262e-16, -1.24803e-15, 0.270016, 0.962856)
bones/43/rotation = Quaternion(1.88564e-14, 0.707107, -1.88564e-14, 0.707107)
bones/44/rotation = Quaternion(-0.705872, -0.0417753, 0.0641594, 0.70419)
bones/45/rotation = Quaternion(0.644378, -0.0244627, 0.00473771, 0.764301)
bones/46/rotation = Quaternion(0.85767, -0.507213, -0.0397527, -0.0745436)
bones/47/rotation = Quaternion(3.53394e-15, -4.89182e-15, 0.270016, 0.962856)
bones/48/rotation = Quaternion(-2.73765e-13, 0.707107, 2.73765e-13, 0.707107)
[node name="Character_Mystic_01" parent="Root Scene/RootNode/Skeleton3D" index="0"]
visible = false
[node name="Character_EvilGod_01" parent="Root Scene/RootNode/Skeleton3D" index="1"]
visible = false
[node name="Character_AncientQueen_01" parent="Root Scene/RootNode/Skeleton3D" index="2"]
visible = false
[node name="Character_Ancient_Warrior_01" parent="Root Scene/RootNode/Skeleton3D" index="3"]
visible = false
[node name="Character_Medusa_01" parent="Root Scene/RootNode/Skeleton3D" index="4"]
visible = false
[node name="Character_SpiritDemon_Glow" parent="Root Scene/RootNode/Skeleton3D" index="5"]
visible = false
[node name="Character_SpiritDemon" parent="Root Scene/RootNode/Skeleton3D" index="6"]
visible = false
[node name="Character_DarkElf_01" parent="Root Scene/RootNode/Skeleton3D" index="7"]
visible = false
[node name="Character_ForestGuardian_01" parent="Root Scene/RootNode/Skeleton3D" index="9"]
visible = false
[node name="Root Scene3" parent="." instance=ExtResource("12_0wtqw")]
transform = Transform3D(-0.795653, -0.605752, 0, -2.64783e-08, 3.47791e-08, 1, -0.605752, 0.795653, -4.37114e-08, 0.773338, 0.0725416, -2.02914)
[node name="Skeleton3D" parent="Root Scene3/RootNode" index="0"]
bones/2/rotation = Quaternion(0.99502, 0.0996789, -1.32247e-15, 7.09436e-17)
bones/3/rotation = Quaternion(0.995186, 0.0980028, 5.60143e-16, -5.62927e-16)
bones/4/rotation = Quaternion(0.99381, 0.11109, -3.91661e-17, -7.27518e-16)
bones/5/rotation = Quaternion(7.05397e-17, -1.30404e-15, -0.0417333, 0.999129)
bones/6/rotation = Quaternion(0.458571, 0.53825, -0.458571, 0.53825)
bones/9/rotation = Quaternion(0.578548, 0.632486, -0.352513, 0.375471)
bones/10/rotation = Quaternion(0.0113281, -0.23686, -0.0338065, 0.970889)
bones/12/rotation = Quaternion(-2.41562e-17, 0.0358308, -1.66793e-15, 0.999358)
bones/13/rotation = Quaternion(0.0254806, -0.276843, -0.0880396, 0.956534)
bones/14/rotation = Quaternion(-0.039942, 0.11784, -0.141636, 0.982068)
bones/15/rotation = Quaternion(-0.0364033, 0.152035, 0.229995, 0.960553)
bones/16/rotation = Quaternion(0.000280495, -0.0657944, -0.00425393, 0.997824)
bones/17/rotation = Quaternion(-0.00115399, 0.0107416, -0.0983299, 0.995095)
bones/18/rotation = Quaternion(-0.0069122, 0.0257174, -0.0570024, 0.998019)
bones/19/rotation = Quaternion(-0.00451965, 0.0280399, 0.159068, 0.986859)
bones/20/rotation = Quaternion(-0.00248643, 0.0438797, -0.0565193, 0.997434)
bones/21/rotation = Quaternion(0.00263727, -0.019492, -0.0212693, 0.99958)
bones/23/rotation = Quaternion(0.0166464, -0.0965253, 0.16913, 0.980714)
bones/24/rotation = Quaternion(0.632486, -0.578548, -0.375471, -0.352513)
bones/25/rotation = Quaternion(0.0113281, -0.23686, -0.0338065, 0.970889)
bones/27/rotation = Quaternion(-1.00832e-16, 0.0358308, 1.17227e-15, 0.999358)
bones/28/rotation = Quaternion(0.0254806, -0.276843, -0.0880396, 0.956534)
bones/29/rotation = Quaternion(-0.039942, 0.11784, -0.141636, 0.982068)
bones/30/rotation = Quaternion(-0.0364033, 0.152035, 0.229995, 0.960553)
bones/31/rotation = Quaternion(0.000280495, -0.0657944, -0.00425393, 0.997824)
bones/32/rotation = Quaternion(-0.00115399, 0.0107416, -0.0983299, 0.995095)
bones/33/rotation = Quaternion(-0.0069122, 0.0257174, -0.0570024, 0.998019)
bones/34/rotation = Quaternion(-0.00451965, 0.0280399, 0.159068, 0.986859)
bones/35/rotation = Quaternion(-0.00248643, 0.0438797, -0.0565193, 0.997434)
bones/36/rotation = Quaternion(0.00263727, -0.019492, -0.0212693, 0.99958)
bones/38/rotation = Quaternion(0.0166464, -0.0965253, 0.16913, 0.980714)
bones/39/rotation = Quaternion(-0.0417753, 0.705872, -0.70419, 0.0641594)
bones/40/rotation = Quaternion(0.644378, -0.0244627, 0.00473771, 0.764301)
bones/41/rotation = Quaternion(0.85767, -0.507213, -0.0397527, -0.0745436)
bones/42/rotation = Quaternion(-8.01262e-16, -1.24803e-15, 0.270016, 0.962856)
bones/43/rotation = Quaternion(1.88564e-14, 0.707107, -1.88564e-14, 0.707107)
bones/44/rotation = Quaternion(-0.705872, -0.0417753, 0.0641594, 0.70419)
bones/45/rotation = Quaternion(0.644378, -0.0244627, 0.00473771, 0.764301)
bones/46/rotation = Quaternion(0.85767, -0.507213, -0.0397527, -0.0745436)
bones/47/rotation = Quaternion(3.53394e-15, -4.89182e-15, 0.270016, 0.962856)
bones/48/rotation = Quaternion(-2.73765e-13, 0.707107, 2.73765e-13, 0.707107)
[node name="Character_Mystic_01" parent="Root Scene3/RootNode/Skeleton3D" index="0"]
visible = false
[node name="Character_EvilGod_01" parent="Root Scene3/RootNode/Skeleton3D" index="1"]
visible = false
[node name="Character_AncientQueen_01" parent="Root Scene3/RootNode/Skeleton3D" index="2"]
visible = false
[node name="Character_Ancient_Warrior_01" parent="Root Scene3/RootNode/Skeleton3D" index="3"]
visible = false
[node name="Character_Medusa_01" parent="Root Scene3/RootNode/Skeleton3D" index="4"]
visible = false
[node name="Character_SpiritDemon_Glow" parent="Root Scene3/RootNode/Skeleton3D" index="5"]
visible = false
[node name="Character_SpiritDemon" parent="Root Scene3/RootNode/Skeleton3D" index="6"]
visible = false
[node name="Character_DarkElf_01" parent="Root Scene3/RootNode/Skeleton3D" index="7"]
visible = false
[node name="Character_ForestGuardian_01" parent="Root Scene3/RootNode/Skeleton3D" index="9"]
visible = false
[node name="RootNode" parent="." instance=ExtResource("13_n80tv")]
active_customization = {
"ArmLowerLeft": 3,
"ArmLowerRight": 3,
"ArmUpperLeft": 1,
"ArmUpperRight": 1,
"BackAttachment": -1,
"Ear": -1,
"ElbowAttachLeft": -1,
"ElbowAttachRight": -1,
"Eyebrow": 0,
"Hair": -1,
"HandLeft": 5,
"HandRight": 5,
"Head": 12,
"HeadCoverings": 3,
"HelmetAttachment": 0,
"Hips": 15,
"HipsAttachment": 0,
"KneeAttachLeft": 0,
"KneeAttachRight": 0,
"LegLeft": 2,
"LegRight": 2,
"ShoulderAttachLeft": 0,
"ShoulderAttachRight": 0,
"Torso": 12
}
transform = Transform3D(1, 0, 0, 0, -2.98023e-08, 1, 0, -1, -2.98023e-08, -2.88206, 0.0698627, 2.16467)
[node name="RootNode2" parent="." instance=ExtResource("13_n80tv")]
active_customization = {
"ArmLowerLeft": 3,
"ArmLowerRight": 3,
"ArmUpperLeft": 1,
"ArmUpperRight": 1,
"BackAttachment": -1,
"Ear": -1,
"ElbowAttachLeft": -1,
"ElbowAttachRight": -1,
"Eyebrow": 0,
"Hair": -1,
"HandLeft": 5,
"HandRight": 5,
"Head": 12,
"HeadCoverings": 3,
"HelmetAttachment": 0,
"Hips": 15,
"HipsAttachment": 0,
"KneeAttachLeft": 0,
"KneeAttachRight": 0,
"LegLeft": 2,
"LegRight": 2,
"ShoulderAttachLeft": 0,
"ShoulderAttachRight": 0,
"Torso": 12
}
transform = Transform3D(-1, -8.74228e-08, 0, -2.6054e-15, 2.98023e-08, 1, -8.74228e-08, 1, -2.98023e-08, 2.14246, 0.0698627, -1.57687)
[node name="Player" parent="." instance=ExtResource("14_cnw06")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.64545, -0.000884213, -1.4917)
[editable path="Root Scene"]
[editable path="Root Scene3"]

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

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

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

Binary file not shown.

View File

@ -0,0 +1,77 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://djx1fn3fntb3y"
path="res://.godot/imported/Characters.fbx-b78b9b169bf2dbff3564f35677dfeeb2.scn"
[deps]
source_file="res://Models/Characters/Characters.fbx"
dest_files=["res://.godot/imported/Characters.fbx-b78b9b169bf2dbff3564f35677dfeeb2.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": {
"A20": {
"use_external/enabled": true,
"use_external/path": "res://Models/Characters/Materials/A20.tres"
},
"_Ghost": {
"use_external/enabled": true,
"use_external/path": "res://Models/Characters/Materials/_Ghost.tres"
},
"lambert10": {
"use_external/enabled": true,
"use_external/path": "res://Models/Characters/Materials/lambert10.tres"
},
"lambert11": {
"use_external/enabled": true,
"use_external/path": "res://Models/Characters/Materials/lambert11.tres"
},
"lambert12": {
"use_external/enabled": true,
"use_external/path": "res://Models/Characters/Materials/lambert12.tres"
},
"lambert13": {
"use_external/enabled": true,
"use_external/path": "res://Models/Characters/Materials/lambert13.tres"
},
"lambert14": {
"use_external/enabled": true,
"use_external/path": "res://Models/Characters/Materials/lambert14.tres"
},
"lambert15": {
"use_external/enabled": true,
"use_external/path": "res://Models/Characters/Materials/lambert15.tres"
},
"lambert2": {
"use_external/enabled": true,
"use_external/path": "res://Models/Characters/Materials/lambert2.tres"
},
"lambert9": {
"use_external/enabled": true,
"use_external/path": "res://Models/Characters/Materials/lambert9.tres"
}
}
}
gltf/naming_version=1
gltf/embedded_image_handling=1

View File

@ -0,0 +1,10 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://dpcx2gc84m4mb"]
[ext_resource type="Texture2D" uid="uid://clhhkyqcf5h8f" path="res://Models/Characters/Textures/FantasyRivals_Texture_01_A.png" id="1_3f30f"]
[resource]
resource_name = "A20"
albedo_color = Color(0.906332, 0.906332, 0.906332, 1)
albedo_texture = ExtResource("1_3f30f")
metallic = 0.2
roughness = 0.8

View File

@ -0,0 +1,8 @@
[gd_resource type="StandardMaterial3D" format=3 uid="uid://da1kgssl5if81"]
[resource]
resource_name = "_Ghost"
vertex_color_use_as_albedo = true
albedo_color = Color(0.906332, 0.906332, 0.906332, 0.496239)
metallic = 0.2
roughness = 0.8

View File

@ -0,0 +1,10 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://b43qg3ciwosal"]
[ext_resource type="Texture2D" uid="uid://clhhkyqcf5h8f" path="res://Models/Characters/Textures/FantasyRivals_Texture_01_A.png" id="1_61ufs"]
[resource]
resource_name = "lambert10"
albedo_color = Color(0.906332, 0.906332, 0.906332, 1)
albedo_texture = ExtResource("1_61ufs")
metallic = 0.2
roughness = 0.8

View File

@ -0,0 +1,10 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://d2ndm87qf7io1"]
[ext_resource type="Texture2D" uid="uid://clhhkyqcf5h8f" path="res://Models/Characters/Textures/FantasyRivals_Texture_01_A.png" id="1_h11jc"]
[resource]
resource_name = "lambert11"
albedo_color = Color(0.906332, 0.906332, 0.906332, 1)
albedo_texture = ExtResource("1_h11jc")
metallic = 0.2
roughness = 0.8

View File

@ -0,0 +1,10 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://cmk5q4vdc3ek7"]
[ext_resource type="Texture2D" uid="uid://clhhkyqcf5h8f" path="res://Models/Characters/Textures/FantasyRivals_Texture_01_A.png" id="1_0b1nj"]
[resource]
resource_name = "lambert12"
albedo_color = Color(0.906332, 0.906332, 0.906332, 1)
albedo_texture = ExtResource("1_0b1nj")
metallic = 0.2
roughness = 0.8

View File

@ -0,0 +1,10 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://cn15la56mt8a1"]
[ext_resource type="Texture2D" uid="uid://clhhkyqcf5h8f" path="res://Models/Characters/Textures/FantasyRivals_Texture_01_A.png" id="1_2jk1b"]
[resource]
resource_name = "lambert13"
albedo_color = Color(0.906332, 0.906332, 0.906332, 1)
albedo_texture = ExtResource("1_2jk1b")
metallic = 0.2
roughness = 0.8

View File

@ -0,0 +1,13 @@
[gd_resource type="StandardMaterial3D" load_steps=3 format=3 uid="uid://b23jx81mk4qe4"]
[ext_resource type="Texture2D" uid="uid://clhhkyqcf5h8f" path="res://Models/Characters/Textures/FantasyRivals_Texture_01_A.png" id="1_p387y"]
[ext_resource type="Texture2D" uid="uid://xsfaqeyhrtcr" path="res://Models/Characters/Textures/FantasyRivals_Texture_01_Emissive.png" id="2_vuvp1"]
[resource]
resource_name = "lambert14"
albedo_color = Color(0.906332, 0.906332, 0.906332, 1)
albedo_texture = ExtResource("1_p387y")
metallic = 0.2
roughness = 0.8
emission_enabled = true
emission_texture = ExtResource("2_vuvp1")

View File

@ -0,0 +1,7 @@
[gd_resource type="StandardMaterial3D" format=3 uid="uid://wk66tnm3k4ct"]
[resource]
resource_name = "lambert15"
albedo_color = Color(0.906332, 0.906332, 0.906332, 1)
metallic = 0.2
roughness = 0.8

View File

@ -1,13 +1,10 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://bycoxdvsaakl"] [gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://dnpkeelcoonfh"]
[ext_resource type="Texture2D" uid="uid://dcjja0gufc40f" path="res://Models/Characters/Textures/PolygonFantasyHero_Texture_01_B.png" id="1_ysskd"] [ext_resource type="Texture2D" uid="uid://clhhkyqcf5h8f" path="res://Models/Characters/Textures/FantasyRivals_Texture_01_A.png" id="1_soi1r"]
[resource] [resource]
resource_name = "lambert2" resource_name = "lambert2"
diffuse_mode = 2 albedo_color = Color(0.906332, 0.906332, 0.906332, 1)
specular_mode = 2 albedo_texture = ExtResource("1_soi1r")
albedo_texture = ExtResource("1_ysskd") metallic = 0.2
rim_tint = 1.0 roughness = 0.8
grow_amount = -0.264
distance_fade_min_distance = 2.4
distance_fade_max_distance = 3.25

View File

@ -0,0 +1,10 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://dx4s0pl4bovxd"]
[ext_resource type="Texture2D" uid="uid://clhhkyqcf5h8f" path="res://Models/Characters/Textures/FantasyRivals_Texture_01_A.png" id="1_5igj4"]
[resource]
resource_name = "lambert9"
albedo_color = Color(0.906332, 0.906332, 0.906332, 1)
albedo_texture = ExtResource("1_5igj4")
metallic = 0.2
roughness = 0.8

View File

@ -0,0 +1,13 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://bycoxdvsaakl"]
[ext_resource type="Texture2D" uid="uid://dcjja0gufc40f" path="res://Models/Characters/Textures/PolygonFantasyHero_Texture_01_B.png" id="1_ysskd"]
[resource]
resource_name = "lambert2"
diffuse_mode = 2
specular_mode = 2
albedo_texture = ExtResource("1_ysskd")
rim_tint = 1.0
grow_amount = -0.264
distance_fade_min_distance = 2.4
distance_fade_max_distance = 3.25

View File

@ -13,7 +13,7 @@ dest_files=["res://.godot/imported/ModularCharacters.fbx-ce6e3e30d0ba5e348821aac
[params] [params]
nodes/root_type="" nodes/root_type="CustomizableCharacter"
nodes/root_name="" nodes/root_name=""
nodes/apply_root_scale=true nodes/apply_root_scale=true
nodes/root_scale=1.0 nodes/root_scale=1.0
@ -33,11 +33,11 @@ _subresources={
"materials": { "materials": {
"lambert2": { "lambert2": {
"use_external/enabled": true, "use_external/enabled": true,
"use_external/path": "res://Models/Characters/Materials/lambert2.tres" "use_external/path": "res://Models/Characters/Materials/mod_chars_1.tres"
}, },
"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/mod_chars_2.tres"
} }
}, },
"nodes": { "nodes": {

Binary file not shown.

View File

@ -0,0 +1,35 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://clhhkyqcf5h8f"
path.s3tc="res://.godot/imported/FantasyRivals_Texture_01_A.png-6a4ca283a782dfd6da76aad701075de8.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://Models/Characters/Textures/FantasyRivals_Texture_01_A.png"
dest_files=["res://.godot/imported/FantasyRivals_Texture_01_A.png-6a4ca283a782dfd6da76aad701075de8.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

Binary file not shown.

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cosqyeum47ouj"
path="res://.godot/imported/FantasyRivals_Texture_01_B.png-6edef5a094a5886017161c3aa99c2331.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Models/Characters/Textures/FantasyRivals_Texture_01_B.png"
dest_files=["res://.godot/imported/FantasyRivals_Texture_01_B.png-6edef5a094a5886017161c3aa99c2331.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

Binary file not shown.

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://xxjlb6ijc2bv"
path="res://.godot/imported/FantasyRivals_Texture_01_C.png-16fd0c3b5e2d10bdae8a83eea1b57e46.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Models/Characters/Textures/FantasyRivals_Texture_01_C.png"
dest_files=["res://.godot/imported/FantasyRivals_Texture_01_C.png-16fd0c3b5e2d10bdae8a83eea1b57e46.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

Binary file not shown.

View File

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://bj7gf6r4kmowb"
path="res://.godot/imported/FantasyRivals_Texture_01_D.png-5266503ab6a33574f567b9f5a049ae17.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://Models/Characters/Textures/FantasyRivals_Texture_01_D.png"
dest_files=["res://.godot/imported/FantasyRivals_Texture_01_D.png-5266503ab6a33574f567b9f5a049ae17.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

Binary file not shown.

View File

@ -0,0 +1,35 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://xsfaqeyhrtcr"
path.s3tc="res://.godot/imported/FantasyRivals_Texture_01_Emissive.png-42108ac76425578a804fdddc8162cf27.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://Models/Characters/Textures/FantasyRivals_Texture_01_Emissive.png"
dest_files=["res://.godot/imported/FantasyRivals_Texture_01_Emissive.png-42108ac76425578a804fdddc8162cf27.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

View File

@ -4,10 +4,9 @@
[resource] [resource]
resource_name = "Texture_01" resource_name = "Texture_01"
albedo_color = Color(1, 0.819608, 0.219608, 1) albedo_color = Color(0.305882, 0.478431, 0.427451, 1)
albedo_texture = ExtResource("1_wwnl0") albedo_texture = ExtResource("1_wwnl0")
metallic_specular = 0.0 metallic_specular = 0.0
roughness = 0.490532 roughness = 0.490532
uv1_offset = Vector3(0, 0, 1) uv1_offset = Vector3(0, 0, 1)
uv1_triplanar = true uv1_triplanar = true
uv1_world_triplanar = true

View File

@ -0,0 +1,12 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://cnatewkictl4q"]
[ext_resource type="Texture2D" uid="uid://blqvnn1uyx5na" path="res://Models/Environments/Textures/PolygonPrototype_Texture_Grid_01.png" id="1_dqqfe"]
[resource]
resource_name = "Texture_01"
albedo_color = Color(0.819608, 0.537255, 0, 1)
albedo_texture = ExtResource("1_dqqfe")
metallic_specular = 0.0
roughness = 0.490532
uv1_offset = Vector3(0, 0, 1)
uv1_triplanar = true

View File

@ -0,0 +1,12 @@
[gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://j71oow54fjat"]
[ext_resource type="Texture2D" uid="uid://blqvnn1uyx5na" path="res://Models/Environments/Textures/PolygonPrototype_Texture_Grid_01.png" id="1_gfptx"]
[resource]
resource_name = "Texture_01"
albedo_color = Color(1, 0.372549, 0.0901961, 1)
albedo_texture = ExtResource("1_gfptx")
metallic_specular = 0.0
roughness = 0.490532
uv1_offset = Vector3(0, 0, 1)
uv1_triplanar = true

BIN
godot/Models/Environments/SM_Buildings_DoorFrame_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://cgajq7ygn3aiy"
path="res://.godot/imported/SM_Buildings_DoorFrame_01.fbx-1b856f7aef0165939c5812701ed2ba34.scn"
[deps]
source_file="res://Models/Environments/SM_Buildings_DoorFrame_01.fbx"
dest_files=["res://.godot/imported/SM_Buildings_DoorFrame_01.fbx-1b856f7aef0165939c5812701ed2ba34.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": {
"Texture_01": {
"use_external/enabled": true,
"use_external/path": "res://Models/Environments/Materials/Texture_03.tres"
}
}
}
gltf/naming_version=1
gltf/embedded_image_handling=1

BIN
godot/Models/Environments/SM_Buildings_Door_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://hu8pchvhxwxn"
path="res://.godot/imported/SM_Buildings_Door_01.fbx-fe1e1429f39f150abf5a941331e28451.scn"
[deps]
source_file="res://Models/Environments/SM_Buildings_Door_01.fbx"
dest_files=["res://.godot/imported/SM_Buildings_Door_01.fbx-fe1e1429f39f150abf5a941331e28451.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": {
"Texture_01": {
"use_external/enabled": true,
"use_external/path": "res://Models/Environments/Materials/Texture_02.tres"
}
}
}
gltf/naming_version=1
gltf/embedded_image_handling=1

BIN
godot/Models/Props/SM_Icon_Coin_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://bhqja56ajroyf"
path="res://.godot/imported/SM_Icon_Coin_01.fbx-8c3d4b7fbbab7005009fa887a67b4b63.scn"
[deps]
source_file="res://Models/Props/SM_Icon_Coin_01.fbx"
dest_files=["res://.godot/imported/SM_Icon_Coin_01.fbx-8c3d4b7fbbab7005009fa887a67b4b63.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

View File

@ -3,25 +3,26 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://daxuhceq1xp8e" uid="uid://daxuhceq1xp8e"
path="res://.godot/imported/Skybox_No_Snow_Diff.png-4aac1df060d706f7f84d7e011badea7b.ctex" path.s3tc="res://.godot/imported/Skybox_No_Snow_Diff.png-4aac1df060d706f7f84d7e011badea7b.s3tc.ctex"
metadata={ metadata={
"vram_texture": false "imported_formats": ["s3tc_bptc"],
"vram_texture": true
} }
[deps] [deps]
source_file="res://Models/Sky/Skybox_No_Snow_Diff.png" source_file="res://Models/Sky/Skybox_No_Snow_Diff.png"
dest_files=["res://.godot/imported/Skybox_No_Snow_Diff.png-4aac1df060d706f7f84d7e011badea7b.ctex"] dest_files=["res://.godot/imported/Skybox_No_Snow_Diff.png-4aac1df060d706f7f84d7e011badea7b.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

@ -3,32 +3,33 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://cbgfiq60qi04y" uid="uid://cbgfiq60qi04y"
path="res://.godot/imported/Skybox_Normal.png-0298afdd81d923bbadde428f4cf9fcc0.ctex" path.s3tc="res://.godot/imported/Skybox_Normal.png-0298afdd81d923bbadde428f4cf9fcc0.s3tc.ctex"
metadata={ metadata={
"vram_texture": false "imported_formats": ["s3tc_bptc"],
"vram_texture": true
} }
[deps] [deps]
source_file="res://Models/Sky/Skybox_Normal.png" source_file="res://Models/Sky/Skybox_Normal.png"
dest_files=["res://.godot/imported/Skybox_Normal.png-0298afdd81d923bbadde428f4cf9fcc0.ctex"] dest_files=["res://.godot/imported/Skybox_Normal.png-0298afdd81d923bbadde428f4cf9fcc0.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=1
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=1
roughness/src_normal="" roughness/src_normal="res://Models/Sky/Skybox_Normal.png"
process/fix_alpha_border=true process/fix_alpha_border=true
process/premult_alpha=false process/premult_alpha=false
process/normal_map_invert_y=false 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

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

View File

@ -14,7 +14,7 @@ dest_files=["res://.godot/imported/SM_Prop_Sword_01.fbx-bcf24ec78f44a339d13c7f93
[params] [params]
nodes/root_type="" nodes/root_type=""
nodes/root_name="" nodes/root_name="SM_Prop_Sword"
nodes/apply_root_scale=true nodes/apply_root_scale=true
nodes/root_scale=1.0 nodes/root_scale=1.0
meshes/ensure_tangents=true meshes/ensure_tangents=true

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

Binary file not shown.

View File

@ -0,0 +1,53 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://f7tvhmjaqgp8"
path="res://.godot/imported/SM_Wep_Axe_01.fbx-c716aff6544e971172cc054fdf973daa.scn"
[deps]
source_file="res://Models/Weapons/SM_Wep_Axe_01.fbx"
dest_files=["res://.godot/imported/SM_Wep_Axe_01.fbx-c716aff6544e971172cc054fdf973daa.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": {
"lambert2": {
"use_external/enabled": true,
"use_external/path": "res://Models/Environments/Materials/Texture_01.tres"
}
},
"meshes": {
"Root Scene_SM_Wep_Axe_01": {
"generate/lightmap_uv": 0,
"generate/lods": 0,
"generate/shadow_meshes": 0,
"lods/normal_merge_angle": 60.0,
"lods/normal_split_angle": 25.0,
"save_to_file/enabled": true,
"save_to_file/make_streamable": "",
"save_to_file/path": "res://Models/Weapons/axe.res"
}
}
}
gltf/naming_version=1
gltf/embedded_image_handling=1

Binary file not shown.

View File

@ -1,7 +1,9 @@
[gd_scene load_steps=10 format=3 uid="uid://dw8q1vqnc657"] [gd_scene load_steps=15 format=3 uid="uid://dw8q1vqnc657"]
[ext_resource type="PackedScene" uid="uid://c8h5f82tunglj" path="res://Models/Characters/ModularCharacters.fbx" id="1_b4mv3"] [ext_resource type="PackedScene" uid="uid://c8h5f82tunglj" path="res://Models/Characters/ModularCharacters.fbx" id="1_b4mv3"]
[ext_resource type="AnimationLibrary" uid="uid://dpa5kel2sewxo" path="res://Models/Characters/Animations/BasicMotions@Idle01.fbx" id="1_wqiit"] [ext_resource type="AnimationLibrary" uid="uid://dpa5kel2sewxo" path="res://Models/Characters/Animations/BasicMotions@Idle01.fbx" id="1_wqiit"]
[ext_resource type="AnimationLibrary" uid="uid://du5bljpia3pci" path="res://Models/Characters/Animations/BasicMotions@Run01.fbx" id="2_nqgk0"]
[ext_resource type="AnimationLibrary" uid="uid://c6hvlg3lbhfjs" path="res://Models/Characters/Animations/BasicMotions@Walk01_ClosedHands.fbx" id="2_qsv71"]
[sub_resource type="Animation" id="Animation_62nln"] [sub_resource type="Animation" id="Animation_62nln"]
resource_name = "Take 001" resource_name = "Take 001"
@ -330,64 +332,64 @@ _data = {
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_3b5eb"] [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_3b5eb"]
animation = &"BasicMotions@Idle01/BasicMotions_Idle01_ClosedHands" animation = &"BasicMotions@Idle01/BasicMotions_Idle01_ClosedHands"
[sub_resource type="AnimationNodeBlend2" id="AnimationNodeBlend2_5ua7i"]
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_p73e4"]
animation = &"BasicMotions@Run01/BasicMotions_Run01 - Forwards"
[sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_idcvn"] [sub_resource type="AnimationNodeBlendTree" id="AnimationNodeBlendTree_idcvn"]
graph_offset = Vector2(-154, 108) graph_offset = Vector2(-578.579, 250.949)
nodes/Animation/node = SubResource("AnimationNodeAnimation_3b5eb") nodes/Idle/node = SubResource("AnimationNodeAnimation_3b5eb")
nodes/Animation/position = Vector2(-320, 140) nodes/Idle/position = Vector2(-320, 140)
node_connections = [&"output", 0, &"Animation"] nodes/IdleWalkBlend/node = SubResource("AnimationNodeBlend2_5ua7i")
nodes/IdleWalkBlend/position = Vector2(140, 140)
nodes/Walk/node = SubResource("AnimationNodeAnimation_p73e4")
nodes/Walk/position = Vector2(-300, 260)
node_connections = [&"IdleWalkBlend", 0, &"Idle", &"IdleWalkBlend", 1, &"Walk", &"output", 0, &"IdleWalkBlend"]
[sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_5wf40"] [sub_resource type="AnimationNodeStateMachineTransition" id="AnimationNodeStateMachineTransition_5wf40"]
advance_mode = 2 advance_mode = 2
[sub_resource type="AnimationNodeStateMachine" id="AnimationNodeStateMachine_7e1iu"] [sub_resource type="AnimationNodeStateMachine" id="AnimationNodeStateMachine_7e1iu"]
states/BlendTree/node = SubResource("AnimationNodeBlendTree_idcvn") states/Idle/node = SubResource("AnimationNodeBlendTree_idcvn")
states/BlendTree/position = Vector2(389, 112) states/Idle/position = Vector2(389, 112)
states/Start/position = Vector2(227, 112) states/Start/position = Vector2(227, 112)
transitions = ["Start", "BlendTree", SubResource("AnimationNodeStateMachineTransition_5wf40")] transitions = ["Start", "Idle", SubResource("AnimationNodeStateMachineTransition_5wf40")]
graph_offset = Vector2(-219, -1) graph_offset = Vector2(-219, -1)
[sub_resource type="GDScript" id="GDScript_nld2l"]
script/source = "extends AnimationTree
@onready var player: Player = get_node(advance_expression_base_node)
var idle_walk_blend = 0.0
func _process(_delta):
if(player.get_is_moving()):
idle_walk_blend = move_toward(idle_walk_blend, 1.0, _delta * 5.0)
else: idle_walk_blend = move_toward(idle_walk_blend, 0.0, _delta * 5.0)
set(\"parameters/Idle/IdleWalkBlend/blend_amount\", idle_walk_blend)
"
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_hqeid"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_hqeid"]
radius = 0.548248 radius = 0.548248
height = 1.85415 height = 1.85415
[node name="Player" type="Player"] [node name="Player" type="Player"]
active_customization = {
"ArmLowerLeft": 2,
"ArmLowerRight": 3,
"ArmUpperLeft": 1,
"ArmUpperRight": 3,
"BackAttachment": 1,
"Ear": -1,
"ElbowAttachLeft": -1,
"ElbowAttachRight": -1,
"Eyebrow": 0,
"Hair": 13,
"HandLeft": 0,
"HandRight": 4,
"Head": 15,
"HeadCoverings": -1,
"HelmetAttachment": -1,
"Hips": 3,
"HipsAttachment": 3,
"KneeAttachLeft": -1,
"KneeAttachRight": -1,
"LegLeft": 12,
"LegRight": 12,
"ShoulderAttachLeft": 16,
"ShoulderAttachRight": -1,
"Torso": 5
}
slide_on_ceiling = false slide_on_ceiling = false
[node name="AnimationTree" type="AnimationTree" parent="."] [node name="AnimationTree" type="AnimationTree" parent="."]
root_node = NodePath("../Model") root_node = NodePath("../Model")
libraries = { libraries = {
"": SubResource("AnimationLibrary_eyw6x"), "": SubResource("AnimationLibrary_eyw6x"),
"BasicMotions@Idle01": ExtResource("1_wqiit") "BasicMotions@Idle01": ExtResource("1_wqiit"),
"BasicMotions@Run01": ExtResource("2_nqgk0"),
"BasicMotions@Walk01_ClosedHands": ExtResource("2_qsv71")
} }
tree_root = SubResource("AnimationNodeStateMachine_7e1iu") tree_root = SubResource("AnimationNodeStateMachine_7e1iu")
advance_expression_base_node = NodePath("..") advance_expression_base_node = NodePath("..")
anim_player = NodePath("../Model/AnimationPlayer") anim_player = NodePath("../Model/AnimationPlayer")
parameters/Idle/IdleWalkBlend/blend_amount = 0
script = SubResource("GDScript_nld2l")
[node name="CollisionShape3D" type="CollisionShape3D" parent="."] [node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.925894, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.925894, 0)
@ -396,20 +398,46 @@ shape = SubResource("CapsuleShape3D_hqeid")
[node name="PlayerInput" type="PlayerInput" parent="."] [node name="PlayerInput" type="PlayerInput" parent="."]
[node name="Model" parent="." instance=ExtResource("1_b4mv3")] [node name="Model" parent="." instance=ExtResource("1_b4mv3")]
active_customization = {
"ArmLowerLeft": 5,
"ArmLowerRight": 5,
"ArmUpperLeft": 1,
"ArmUpperRight": 1,
"BackAttachment": -1,
"Ear": -1,
"ElbowAttachLeft": 1,
"ElbowAttachRight": 1,
"Eyebrow": 1,
"Hair": -1,
"HandLeft": 1,
"HandRight": 1,
"Head": 8,
"HeadCoverings": -1,
"HelmetAttachment": -1,
"Hips": 2,
"HipsAttachment": 5,
"KneeAttachLeft": -1,
"KneeAttachRight": -1,
"LegLeft": 6,
"LegRight": 6,
"ShoulderAttachLeft": -1,
"ShoulderAttachRight": -1,
"Torso": 6
}
[node name="GeneralSkeleton" parent="Model/RootNode" index="0"] [node name="GeneralSkeleton" parent="Model/RootNode" index="0"]
bones/0/rotation = Quaternion(-2.98023e-08, 5.55112e-17, 5.55112e-17, 1) bones/0/rotation = Quaternion(-2.98023e-08, 5.55112e-17, 5.55112e-17, 1)
bones/1/position = Vector3(0.00799814, 0.822939, -0.0170919) bones/1/position = Vector3(0.0064089, 0.824015, -0.0161932)
bones/1/rotation = Quaternion(-0.0173024, -0.0769098, 0.00854839, 0.996851) bones/1/rotation = Quaternion(-0.0186555, -0.0848505, 0.0122633, 0.996144)
bones/2/rotation = Quaternion(0.00896411, 0.00637054, 0.000265095, 0.99994) bones/2/rotation = Quaternion(0.00877745, 0.00637038, 0.000268667, 0.999941)
bones/3/rotation = Quaternion(0.00882963, 0.00637047, 0.000267564, 0.999941) bones/3/rotation = Quaternion(0.00861796, 0.00637028, 0.0002716, 0.999943)
bones/4/rotation = Quaternion(0.00907812, 0.00637071, 0.000262791, 0.999939) bones/4/rotation = Quaternion(0.0088558, 0.00637049, 0.000267043, 0.99994)
bones/5/rotation = Quaternion(-0.0130848, 0.0288738, -0.00513406, 0.999484) bones/5/rotation = Quaternion(-0.0139191, 0.0328765, -0.00679956, 0.999339)
bones/6/rotation = Quaternion(-0.0130942, 0.0288758, -0.00513693, 0.999484) bones/6/rotation = Quaternion(-0.0139146, 0.0328705, -0.00679594, 0.99934)
bones/10/rotation = Quaternion(0.519859, 0.470118, 0.477057, -0.530238) bones/10/rotation = Quaternion(0.519859, 0.470118, 0.477057, -0.530238)
bones/11/rotation = Quaternion(0.24205, 0.842133, -0.4545, -0.160169) bones/11/rotation = Quaternion(0.247455, 0.839095, -0.458569, -0.156207)
bones/12/rotation = Quaternion(-0.0282314, -0.699896, -0.0284688, 0.713119) bones/12/rotation = Quaternion(-0.039877, -0.696571, -0.0402117, 0.715249)
bones/13/rotation = Quaternion(-0.0439467, 0.565119, -0.143898, 0.811174) bones/13/rotation = Quaternion(-0.0420627, 0.558109, -0.139609, 0.816857)
bones/14/rotation = Quaternion(-0.256269, 0.776338, 0.203807, 0.538599) bones/14/rotation = Quaternion(-0.256269, 0.776338, 0.203807, 0.538599)
bones/15/rotation = Quaternion(0.14485, 0.51961, 0.145065, 0.829446) bones/15/rotation = Quaternion(0.14485, 0.51961, 0.145065, 0.829446)
bones/16/rotation = Quaternion(0.159353, 0.516644, 0.140377, 0.829446) bones/16/rotation = Quaternion(0.159353, 0.516644, 0.140377, 0.829446)
@ -420,9 +448,9 @@ bones/21/rotation = Quaternion(0.494946, 0.0399225, 0.106743, 0.861418)
bones/22/rotation = Quaternion(0.554517, 0.0271624, 0.0237916, 0.831389) bones/22/rotation = Quaternion(0.554517, 0.0271624, 0.0237916, 0.831389)
bones/23/rotation = Quaternion(0.554045, 0.0389721, 0.0175394, 0.831389) bones/23/rotation = Quaternion(0.554045, 0.0389721, 0.0175394, 0.831389)
bones/27/rotation = Quaternion(0.5168, -0.475173, -0.481158, -0.52499) bones/27/rotation = Quaternion(0.5168, -0.475173, -0.481158, -0.52499)
bones/28/rotation = Quaternion(-0.125884, 0.859315, -0.455472, 0.195646) bones/28/rotation = Quaternion(-0.115133, 0.860735, -0.451588, 0.20481)
bones/29/rotation = Quaternion(0.0109876, 0.709589, -0.0110795, 0.704443) bones/29/rotation = Quaternion(0.0209625, 0.711686, -0.0211379, 0.701867)
bones/30/rotation = Quaternion(0.0112271, -0.589384, 0.0652025, 0.805139) bones/30/rotation = Quaternion(0.00773145, -0.600065, 0.0707188, 0.796782)
bones/31/rotation = Quaternion(-0.256268, -0.776338, -0.203807, 0.538599) bones/31/rotation = Quaternion(-0.256268, -0.776338, -0.203807, 0.538599)
bones/32/rotation = Quaternion(0.14485, -0.51961, -0.145065, 0.829446) bones/32/rotation = Quaternion(0.14485, -0.51961, -0.145065, 0.829446)
bones/33/rotation = Quaternion(0.159352, -0.516644, -0.140377, 0.829446) bones/33/rotation = Quaternion(0.159352, -0.516644, -0.140377, 0.829446)
@ -432,19 +460,19 @@ bones/36/rotation = Quaternion(0.49701, -0.238709, -0.0692157, 0.831389)
bones/38/rotation = Quaternion(0.494946, -0.0399222, -0.106743, 0.861418) bones/38/rotation = Quaternion(0.494946, -0.0399222, -0.106743, 0.861418)
bones/39/rotation = Quaternion(0.554517, -0.0271621, -0.0237913, 0.831389) bones/39/rotation = Quaternion(0.554517, -0.0271621, -0.0237913, 0.831389)
bones/40/rotation = Quaternion(0.554045, -0.0389717, -0.0175393, 0.831389) bones/40/rotation = Quaternion(0.554045, -0.0389717, -0.0175393, 0.831389)
bones/50/rotation = Quaternion(-0.0911938, 0.0463263, 0.991272, 0.0831711) bones/50/rotation = Quaternion(-0.0826276, 0.0457204, 0.991888, 0.085091)
bones/50/scale = Vector3(1.00002, 0.999999, 1) bones/50/scale = Vector3(1.00002, 0.999999, 1)
bones/51/rotation = Quaternion(0.00970492, 0.959913, -0.280113, -0.0029922) bones/51/rotation = Quaternion(0.00967221, 0.960188, -0.27917, -0.00298206)
bones/51/scale = Vector3(1.00002, 0.999999, 1.00002) bones/51/scale = Vector3(1.00002, 0.999999, 1.00002)
bones/52/rotation = Quaternion(0.0792991, 0.536526, -0.839989, -0.0164049) bones/52/rotation = Quaternion(0.0778185, 0.536789, -0.839965, -0.0161634)
bones/52/scale = Vector3(0.999948, 0.999973, 1.00001) bones/52/scale = Vector3(0.999948, 0.999973, 1.00001)
bones/54/rotation = Quaternion(9.7728e-07, 1, -1.50204e-05, 3.50609e-06) bones/54/rotation = Quaternion(9.7728e-07, 1, -1.50204e-05, 3.50609e-06)
bones/54/scale = Vector3(0.999999, 0.999986, 1.00002) bones/54/scale = Vector3(0.999999, 0.999986, 1.00002)
bones/56/rotation = Quaternion(0.179453, 0.139217, 0.970475, -0.0811989) bones/56/rotation = Quaternion(0.188468, 0.132146, 0.969868, -0.079841)
bones/56/scale = Vector3(1.00002, 0.999999, 1) bones/56/scale = Vector3(1.00002, 0.999999, 1)
bones/57/rotation = Quaternion(-0.0102556, 0.955128, -0.295999, 0.00316205) bones/57/rotation = Quaternion(-0.0100069, 0.957327, -0.288819, 0.00308538)
bones/57/scale = Vector3(1.00001, 0.999999, 1.00001) bones/57/scale = Vector3(1.00001, 0.999999, 1.00001)
bones/58/rotation = Quaternion(-0.0675913, 0.607901, -0.790822, 0.0220936) bones/58/rotation = Quaternion(-0.069029, 0.610718, -0.78851, 0.0226031)
bones/58/scale = Vector3(0.999956, 0.999987, 1.00001) bones/58/scale = Vector3(0.999956, 0.999987, 1.00001)
bones/60/rotation = Quaternion(-6.79618e-07, 1, -9.98378e-06, -2.30227e-06) bones/60/rotation = Quaternion(-6.79618e-07, 1, -9.98378e-06, -2.30227e-06)
bones/60/scale = Vector3(0.999999, 0.999991, 1.00001) bones/60/scale = Vector3(0.999999, 0.999991, 1.00001)
@ -572,6 +600,9 @@ visible = false
[node name="Chr_Hair_13" parent="Model/RootNode/GeneralSkeleton" index="40"] [node name="Chr_Hair_13" parent="Model/RootNode/GeneralSkeleton" index="40"]
visible = false visible = false
[node name="Chr_Hair_14" parent="Model/RootNode/GeneralSkeleton" index="41"]
visible = false
[node name="Chr_Hair_15" parent="Model/RootNode/GeneralSkeleton" index="42"] [node name="Chr_Hair_15" parent="Model/RootNode/GeneralSkeleton" index="42"]
visible = false visible = false
@ -686,6 +717,9 @@ visible = false
[node name="Chr_BackAttachment_01" parent="Model/RootNode/GeneralSkeleton" index="79"] [node name="Chr_BackAttachment_01" parent="Model/RootNode/GeneralSkeleton" index="79"]
visible = false visible = false
[node name="Chr_BackAttachment_02" parent="Model/RootNode/GeneralSkeleton" index="80"]
visible = false
[node name="Chr_BackAttachment_03" parent="Model/RootNode/GeneralSkeleton" index="81"] [node name="Chr_BackAttachment_03" parent="Model/RootNode/GeneralSkeleton" index="81"]
visible = false visible = false
@ -836,6 +870,9 @@ visible = false
[node name="Chr_ShoulderAttachLeft_16" parent="Model/RootNode/GeneralSkeleton" index="130"] [node name="Chr_ShoulderAttachLeft_16" parent="Model/RootNode/GeneralSkeleton" index="130"]
visible = false visible = false
[node name="Chr_ShoulderAttachLeft_17" parent="Model/RootNode/GeneralSkeleton" index="131"]
visible = false
[node name="Chr_ShoulderAttachLeft_18" parent="Model/RootNode/GeneralSkeleton" index="132"] [node name="Chr_ShoulderAttachLeft_18" parent="Model/RootNode/GeneralSkeleton" index="132"]
visible = false visible = false
@ -851,9 +888,6 @@ visible = false
[node name="Chr_ElbowAttachRight_01" parent="Model/RootNode/GeneralSkeleton" index="136"] [node name="Chr_ElbowAttachRight_01" parent="Model/RootNode/GeneralSkeleton" index="136"]
visible = false visible = false
[node name="Chr_ElbowAttachRight_02" parent="Model/RootNode/GeneralSkeleton" index="137"]
visible = false
[node name="Chr_ElbowAttachRight_03" parent="Model/RootNode/GeneralSkeleton" index="138"] [node name="Chr_ElbowAttachRight_03" parent="Model/RootNode/GeneralSkeleton" index="138"]
visible = false visible = false
@ -869,9 +903,6 @@ visible = false
[node name="Chr_ElbowAttachLeft_01" parent="Model/RootNode/GeneralSkeleton" index="142"] [node name="Chr_ElbowAttachLeft_01" parent="Model/RootNode/GeneralSkeleton" index="142"]
visible = false visible = false
[node name="Chr_ElbowAttachLeft_02" parent="Model/RootNode/GeneralSkeleton" index="143"]
visible = false
[node name="Chr_ElbowAttachLeft_03" parent="Model/RootNode/GeneralSkeleton" index="144"] [node name="Chr_ElbowAttachLeft_03" parent="Model/RootNode/GeneralSkeleton" index="144"]
visible = false visible = false
@ -893,10 +924,10 @@ visible = false
[node name="Chr_HipsAttachment_03" parent="Model/RootNode/GeneralSkeleton" index="150"] [node name="Chr_HipsAttachment_03" parent="Model/RootNode/GeneralSkeleton" index="150"]
visible = false visible = false
[node name="Chr_HipsAttachment_05" parent="Model/RootNode/GeneralSkeleton" index="152"] [node name="Chr_HipsAttachment_04" parent="Model/RootNode/GeneralSkeleton" index="151"]
visible = false visible = false
[node name="Chr_HipsAttachment_06" parent="Model/RootNode/GeneralSkeleton" index="153"] [node name="Chr_HipsAttachment_05" parent="Model/RootNode/GeneralSkeleton" index="152"]
visible = false visible = false
[node name="Chr_HipsAttachment_07" parent="Model/RootNode/GeneralSkeleton" index="154"] [node name="Chr_HipsAttachment_07" parent="Model/RootNode/GeneralSkeleton" index="154"]
@ -1016,9 +1047,6 @@ visible = false
[node name="Chr_Head_No_Elements_Female_08" parent="Model/RootNode/GeneralSkeleton" index="192"] [node name="Chr_Head_No_Elements_Female_08" parent="Model/RootNode/GeneralSkeleton" index="192"]
visible = false visible = false
[node name="Chr_Head_No_Elements_Female_09" parent="Model/RootNode/GeneralSkeleton" index="193"]
visible = false
[node name="Chr_Head_No_Elements_Female_10" parent="Model/RootNode/GeneralSkeleton" index="194"] [node name="Chr_Head_No_Elements_Female_10" parent="Model/RootNode/GeneralSkeleton" index="194"]
visible = false visible = false
@ -1037,6 +1065,9 @@ visible = false
[node name="Chr_Head_Female_01" parent="Model/RootNode/GeneralSkeleton" index="199"] [node name="Chr_Head_Female_01" parent="Model/RootNode/GeneralSkeleton" index="199"]
visible = false visible = false
[node name="Chr_Head_Female_02" parent="Model/RootNode/GeneralSkeleton" index="200"]
visible = false
[node name="Chr_Head_Female_03" parent="Model/RootNode/GeneralSkeleton" index="201"] [node name="Chr_Head_Female_03" parent="Model/RootNode/GeneralSkeleton" index="201"]
visible = false visible = false
@ -1097,7 +1128,7 @@ visible = false
[node name="Chr_Head_Female_22" parent="Model/RootNode/GeneralSkeleton" index="220"] [node name="Chr_Head_Female_22" parent="Model/RootNode/GeneralSkeleton" index="220"]
visible = false visible = false
[node name="Chr_Eyebrow_Female_02" parent="Model/RootNode/GeneralSkeleton" index="222"] [node name="Chr_Eyebrow_Female_01" parent="Model/RootNode/GeneralSkeleton" index="221"]
visible = false visible = false
[node name="Chr_Eyebrow_Female_03" parent="Model/RootNode/GeneralSkeleton" index="223"] [node name="Chr_Eyebrow_Female_03" parent="Model/RootNode/GeneralSkeleton" index="223"]
@ -1130,7 +1161,7 @@ visible = false
[node name="Chr_Torso_Female_04" parent="Model/RootNode/GeneralSkeleton" index="232"] [node name="Chr_Torso_Female_04" parent="Model/RootNode/GeneralSkeleton" index="232"]
visible = false visible = false
[node name="Chr_Torso_Female_06" parent="Model/RootNode/GeneralSkeleton" index="234"] [node name="Chr_Torso_Female_05" parent="Model/RootNode/GeneralSkeleton" index="233"]
visible = false visible = false
[node name="Chr_Torso_Female_07" parent="Model/RootNode/GeneralSkeleton" index="235"] [node name="Chr_Torso_Female_07" parent="Model/RootNode/GeneralSkeleton" index="235"]
@ -1202,10 +1233,10 @@ visible = false
[node name="Chr_ArmUpperRight_Female_00" parent="Model/RootNode/GeneralSkeleton" index="257"] [node name="Chr_ArmUpperRight_Female_00" parent="Model/RootNode/GeneralSkeleton" index="257"]
visible = false visible = false
[node name="Chr_ArmUpperRight_Female_01" parent="Model/RootNode/GeneralSkeleton" index="258"] [node name="Chr_ArmUpperRight_Female_02" parent="Model/RootNode/GeneralSkeleton" index="259"]
visible = false visible = false
[node name="Chr_ArmUpperRight_Female_02" parent="Model/RootNode/GeneralSkeleton" index="259"] [node name="Chr_ArmUpperRight_Female_03" parent="Model/RootNode/GeneralSkeleton" index="260"]
visible = false visible = false
[node name="Chr_ArmUpperRight_Female_04" parent="Model/RootNode/GeneralSkeleton" index="261"] [node name="Chr_ArmUpperRight_Female_04" parent="Model/RootNode/GeneralSkeleton" index="261"]
@ -1328,10 +1359,10 @@ visible = false
[node name="Chr_ArmLowerRight_Female_02" parent="Model/RootNode/GeneralSkeleton" index="301"] [node name="Chr_ArmLowerRight_Female_02" parent="Model/RootNode/GeneralSkeleton" index="301"]
visible = false visible = false
[node name="Chr_ArmLowerRight_Female_04" parent="Model/RootNode/GeneralSkeleton" index="303"] [node name="Chr_ArmLowerRight_Female_03" parent="Model/RootNode/GeneralSkeleton" index="302"]
visible = false visible = false
[node name="Chr_ArmLowerRight_Female_05" parent="Model/RootNode/GeneralSkeleton" index="304"] [node name="Chr_ArmLowerRight_Female_04" parent="Model/RootNode/GeneralSkeleton" index="303"]
visible = false visible = false
[node name="Chr_ArmLowerRight_Female_06" parent="Model/RootNode/GeneralSkeleton" index="305"] [node name="Chr_ArmLowerRight_Female_06" parent="Model/RootNode/GeneralSkeleton" index="305"]
@ -1379,15 +1410,15 @@ visible = false
[node name="Chr_ArmLowerLeft_Female_01" parent="Model/RootNode/GeneralSkeleton" index="319"] [node name="Chr_ArmLowerLeft_Female_01" parent="Model/RootNode/GeneralSkeleton" index="319"]
visible = false visible = false
[node name="Chr_ArmLowerLeft_Female_02" parent="Model/RootNode/GeneralSkeleton" index="320"]
visible = false
[node name="Chr_ArmLowerLeft_Female_03" parent="Model/RootNode/GeneralSkeleton" index="321"] [node name="Chr_ArmLowerLeft_Female_03" parent="Model/RootNode/GeneralSkeleton" index="321"]
visible = false visible = false
[node name="Chr_ArmLowerLeft_Female_04" parent="Model/RootNode/GeneralSkeleton" index="322"] [node name="Chr_ArmLowerLeft_Female_04" parent="Model/RootNode/GeneralSkeleton" index="322"]
visible = false visible = false
[node name="Chr_ArmLowerLeft_Female_05" parent="Model/RootNode/GeneralSkeleton" index="323"]
visible = false
[node name="Chr_ArmLowerLeft_Female_06" parent="Model/RootNode/GeneralSkeleton" index="324"] [node name="Chr_ArmLowerLeft_Female_06" parent="Model/RootNode/GeneralSkeleton" index="324"]
visible = false visible = false
@ -1430,15 +1461,15 @@ visible = false
[node name="Chr_HandRight_Female_00" parent="Model/RootNode/GeneralSkeleton" index="337"] [node name="Chr_HandRight_Female_00" parent="Model/RootNode/GeneralSkeleton" index="337"]
visible = false visible = false
[node name="Chr_HandRight_Female_01" parent="Model/RootNode/GeneralSkeleton" index="338"]
visible = false
[node name="Chr_HandRight_Female_02" parent="Model/RootNode/GeneralSkeleton" index="339"] [node name="Chr_HandRight_Female_02" parent="Model/RootNode/GeneralSkeleton" index="339"]
visible = false visible = false
[node name="Chr_HandRight_Female_03" parent="Model/RootNode/GeneralSkeleton" index="340"] [node name="Chr_HandRight_Female_03" parent="Model/RootNode/GeneralSkeleton" index="340"]
visible = false visible = false
[node name="Chr_HandRight_Female_04" parent="Model/RootNode/GeneralSkeleton" index="341"]
visible = false
[node name="Chr_HandRight_Female_05" parent="Model/RootNode/GeneralSkeleton" index="342"] [node name="Chr_HandRight_Female_05" parent="Model/RootNode/GeneralSkeleton" index="342"]
visible = false visible = false
@ -1478,7 +1509,7 @@ visible = false
[node name="Chr_HandRight_Female_17" parent="Model/RootNode/GeneralSkeleton" index="354"] [node name="Chr_HandRight_Female_17" parent="Model/RootNode/GeneralSkeleton" index="354"]
visible = false visible = false
[node name="Chr_HandLeft_Female_01" parent="Model/RootNode/GeneralSkeleton" index="356"] [node name="Chr_HandLeft_Female_00" parent="Model/RootNode/GeneralSkeleton" index="355"]
visible = false visible = false
[node name="Chr_HandLeft_Female_02" parent="Model/RootNode/GeneralSkeleton" index="357"] [node name="Chr_HandLeft_Female_02" parent="Model/RootNode/GeneralSkeleton" index="357"]
@ -1535,7 +1566,7 @@ visible = false
[node name="Chr_Hips_Female_01" parent="Model/RootNode/GeneralSkeleton" index="374"] [node name="Chr_Hips_Female_01" parent="Model/RootNode/GeneralSkeleton" index="374"]
visible = false visible = false
[node name="Chr_Hips_Female_02" parent="Model/RootNode/GeneralSkeleton" index="375"] [node name="Chr_Hips_Female_03" parent="Model/RootNode/GeneralSkeleton" index="376"]
visible = false visible = false
[node name="Chr_Hips_Female_04" parent="Model/RootNode/GeneralSkeleton" index="377"] [node name="Chr_Hips_Female_04" parent="Model/RootNode/GeneralSkeleton" index="377"]
@ -1631,9 +1662,6 @@ visible = false
[node name="Chr_LegRight_Female_05" parent="Model/RootNode/GeneralSkeleton" index="407"] [node name="Chr_LegRight_Female_05" parent="Model/RootNode/GeneralSkeleton" index="407"]
visible = false visible = false
[node name="Chr_LegRight_Female_06" parent="Model/RootNode/GeneralSkeleton" index="408"]
visible = false
[node name="Chr_LegRight_Female_07" parent="Model/RootNode/GeneralSkeleton" index="409"] [node name="Chr_LegRight_Female_07" parent="Model/RootNode/GeneralSkeleton" index="409"]
visible = false visible = false
@ -1649,6 +1677,9 @@ visible = false
[node name="Chr_LegRight_Female_11" parent="Model/RootNode/GeneralSkeleton" index="413"] [node name="Chr_LegRight_Female_11" parent="Model/RootNode/GeneralSkeleton" index="413"]
visible = false visible = false
[node name="Chr_LegRight_Female_12" parent="Model/RootNode/GeneralSkeleton" index="414"]
visible = false
[node name="Chr_LegRight_Female_13" parent="Model/RootNode/GeneralSkeleton" index="415"] [node name="Chr_LegRight_Female_13" parent="Model/RootNode/GeneralSkeleton" index="415"]
visible = false visible = false
@ -1688,9 +1719,6 @@ visible = false
[node name="Chr_LegLeft_Female_05" parent="Model/RootNode/GeneralSkeleton" index="427"] [node name="Chr_LegLeft_Female_05" parent="Model/RootNode/GeneralSkeleton" index="427"]
visible = false visible = false
[node name="Chr_LegLeft_Female_06" parent="Model/RootNode/GeneralSkeleton" index="428"]
visible = false
[node name="Chr_LegLeft_Female_07" parent="Model/RootNode/GeneralSkeleton" index="429"] [node name="Chr_LegLeft_Female_07" parent="Model/RootNode/GeneralSkeleton" index="429"]
visible = false visible = false
@ -1706,6 +1734,9 @@ visible = false
[node name="Chr_LegLeft_Female_11" parent="Model/RootNode/GeneralSkeleton" index="433"] [node name="Chr_LegLeft_Female_11" parent="Model/RootNode/GeneralSkeleton" index="433"]
visible = false visible = false
[node name="Chr_LegLeft_Female_12" parent="Model/RootNode/GeneralSkeleton" index="434"]
visible = false
[node name="Chr_LegLeft_Female_13" parent="Model/RootNode/GeneralSkeleton" index="435"] [node name="Chr_LegLeft_Female_13" parent="Model/RootNode/GeneralSkeleton" index="435"]
visible = false visible = false
@ -1730,7 +1761,9 @@ visible = false
[node name="AnimationPlayer" parent="Model" index="1"] [node name="AnimationPlayer" parent="Model" index="1"]
libraries = { libraries = {
"": SubResource("AnimationLibrary_eyw6x"), "": SubResource("AnimationLibrary_eyw6x"),
"BasicMotions@Idle01": ExtResource("1_wqiit") "BasicMotions@Idle01": ExtResource("1_wqiit"),
"BasicMotions@Run01": ExtResource("2_nqgk0"),
"BasicMotions@Walk01_ClosedHands": ExtResource("2_qsv71")
} }
[editable path="Model"] [editable path="Model"]

View File

@ -0,0 +1,115 @@
#include "customizable_character.hpp"
#include "godot_cpp/variant/utility_functions.hpp"
#include "godot_macros.h"
namespace godot {
void CustomizableCharacter::_bind_methods() {
#define CLASSNAME CustomizableCharacter
GDPROPERTY(active_customization, Variant::DICTIONARY);
}
void CustomizableCharacter::set_customization_active(Node3D *node, bool active) {
node->set_visible(active);
node->set_process(active);
}
void CustomizableCharacter::_enter_tree() {
}
void CustomizableCharacter::_ready() {
this->customization_init();
}
void CustomizableCharacter::select_customization(String category, std::optional<size_t> index) {
if (this->customization.find(category) == this->customization.end())
return;
CustomizationState& pair = this->customization.at(category);
// invalid keys are stored as the size of the array
if (index.has_value() && index.value() >= pair.options.size())
index = std::nullopt;
// nothing changes
if (index == pair.currentSelected)
return;
// disable previous chosen option, if any
if (pair.currentSelected.has_value())
CustomizableCharacter::set_customization_active(pair.options.at(pair.currentSelected.value()), false);
// enable chosen option, if any
if (index.has_value())
CustomizableCharacter::set_customization_active(pair.options.at(index.value()), true);
pair.currentSelected = index;
}
Dictionary CustomizableCharacter::get_active_customization() const {
Dictionary result{};
// translate the map to a dictionary of categories -> indexes
for (std::pair<String, CustomizationState> const& pair : this->customization) {
result[pair.first] = pair.second.currentSelected.has_value()
? pair.second.currentSelected.value()
: -1; // an invalid key will always be -1
}
return result;
}
void CustomizableCharacter::set_active_customization(Dictionary value) {
for (size_t i = 0; i < value.size(); ++i) {
String key = value.keys()[i];
size_t selection = value[key];
// wether or not the a given key exists in the customization map
bool exists = this->customization.find(key) != this->customization.end();
// if not, it can be added, as long as the customization map has not yet
// been initialized by _ready
if (!exists && this->customizationParent == nullptr)
this->customization.insert({key, {std::optional{selection}, {}}});
// if the key does not exist in customization and _ready is already
// called, the key is not valid and discarted
else if (!exists)
return;
else
this->select_customization(key, selection >= 0
? std::optional{selection}
: std::nullopt);
}
}
void CustomizableCharacter::customization_init() {
this->customizationParent =
this->get_node<Skeleton3D>("RootNode/GeneralSkeleton");
if (this->customizationParent == nullptr)
return;
for (int i = 0; i < customizationParent->get_child_count(); ++i) {
// get the next valid child
Node3D* child = Object::cast_to<Node3D>(this->customizationParent->get_child(i));
if (child == nullptr)
continue;
// split it's name into parts based on _
// the format for the names will be Chr_<CATEGORY NAME>_<ADDITIONAL IDENTIFIERS>_<NUMBER> numbering IS NOT guaranteed to start at 0 OR 1
// the category name will serve as the key to the customization map
// additional identifiers are ignored
PackedStringArray slices = child->get_name().split("_", false);
// create a new customization state if one does not exist for this category
if (this->customization.find(slices[1]) == this->customization.end())
this->customization.insert({slices[1], {std::optional{0}, {}}});
// add the new child to the customization options for this category
CustomizationState& state = this->customization.at(slices[1]);
state.options.push_back(child);
// set invisible if this child is not the current selection
CustomizableCharacter::set_customization_active(child, state.currentSelected == state.options.size() - 1);
}
// collect customization categories that do not contain any options
std::vector<String> empty{};
for (std::pair<const String, CustomizationState>& pair :
this->customization) {
if (pair.second.options.size() == 0)
empty.push_back(pair.first);
if (pair.second.currentSelected.has_value() &&
pair.second.currentSelected.value() > pair.second.options.size())
pair.second.currentSelected = std::nullopt;
UtilityFunctions::print("- ", pair.first);
}
// remove collected empty categories
for (String const& key : empty) {
this->customization.erase(key);
UtilityFunctions::print("removing ", key);
}
}
}

View File

@ -0,0 +1,45 @@
#ifndef CUSTOMIZABLE_CHARACTER_HPP
#define CUSTOMIZABLE_CHARACTER_HPP
#include <optional>
#include <map>
#include "godot_cpp/classes/node3d.hpp"
#include "godot_cpp/classes/skeleton3d.hpp"
namespace godot {
class CustomizableCharacter : public Node3D {
GDCLASS(CustomizableCharacter, Node3D);
static void _bind_methods();
// the current customization state of a body part/attachment
struct CustomizationState {
// current selected option
std::optional<size_t> currentSelected{std::nullopt};
// cache of all options
std::vector<Node3D *> options{};
};
static void set_customization_active(Node3D *node, bool active);
private:
// all customization options categorized according to body part
std::map<String, CustomizationState> customization{};
// the skeleton of the customizable character model
Skeleton3D *customizationParent{nullptr};
public:
virtual void _enter_tree() override;
virtual void _ready() override;
// Swap out the currently active customization for this category
void select_customization(String category, std::optional<size_t> value);
// Construct a dictionary of [String, int] where the key is a category
// from the customization map. And the value is the index of the
// active element from the category.
Dictionary get_active_customization() const;
// change active customization as if select_customization was called for
// every element in a [String, int] dictionary, where key is the category
// to assign to and the value is the index of the element to show.
void set_active_customization(Dictionary value);
void customization_init();
};
}
#endif // !CUSTOMIZABLE_CHARACTER_HPP

12
src/hitable_interface.hpp Normal file
View File

@ -0,0 +1,12 @@
#ifndef HITABLE_INTERFACE_HPP
#define HITABLE_INTERFACE_HPP
namespace godot {
class Node;
class HitableInterface {
public:
virtual void damage(Node *origin, int amount) = 0; };
}
#endif // !HITABLE_INTERFACE_HPP

View File

@ -14,11 +14,9 @@
namespace godot { namespace godot {
void Player::_bind_methods() { void Player::_bind_methods() {
#define CLASSNAME Player #define CLASSNAME Player
#ifndef NDEBUG
GDPROPERTY(active_customization, Variant::DICTIONARY);
#endif
GDFUNCTION_ARGS(on_horizontal, "event", "value"); GDFUNCTION_ARGS(on_horizontal, "event", "value");
GDFUNCTION_ARGS(on_vertical, "event", "value"); GDFUNCTION_ARGS(on_vertical, "event", "value");
GDFUNCTION(get_is_moving);
} }
void Player::_enter_tree() { void Player::_enter_tree() {
@ -29,9 +27,8 @@ void Player::_enter_tree() {
} }
void Player::_ready() { void Player::_ready() {
this->customization_init();
GDGAMEONLY(); GDGAMEONLY();
this->flat_view_init(); this->flat_view_update();
this->input->listen_to(PlayerInput::Listener("move_left", "move_right", this, "on_horizontal")); this->input->listen_to(PlayerInput::Listener("move_left", "move_right", this, "on_horizontal"));
this->input->listen_to(PlayerInput::Listener("move_forward", "move_back", this, "on_vertical")); this->input->listen_to(PlayerInput::Listener("move_forward", "move_back", this, "on_vertical"));
} }
@ -54,73 +51,17 @@ void Player::_physics_process(double deltaTime) {
this->move_and_slide(); this->move_and_slide();
} }
void Player::set_customization_active(Node3D *node, bool active) { void Player::damage(Node *origin, int amount) {
node->set_visible(active);
node->set_process(active);
} }
void Player::on_horizontal(Ref<InputEvent> event, float value) { void Player::on_horizontal(Ref<InputEvent> event, float value) {
UtilityFunctions::print("horizontal ", value);
this->moveInput.x = value; this->moveInput.x = value;
} }
void Player::on_vertical(Ref<InputEvent> event, float value) { void Player::on_vertical(Ref<InputEvent> event, float value) {
UtilityFunctions::print("vertical ", value);
this->moveInput.y = 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;
CustomizationState& pair = this->customization.at(category);
// invalid keys are stored as the size of the array
if (index.has_value() && index.value() > pair.options.size())
index = std::nullopt;
// nothing changesw
if (index == pair.currentSelected)
return;
// disable previous chosen option, if any
if (pair.currentSelected.has_value())
Player::set_customization_active(pair.options.at(pair.currentSelected.value()), false);
// enable chosen option, if any
if (index.has_value())
Player::set_customization_active(pair.options.at(index.value()), false);
pair.currentSelected = index;
}
Dictionary Player::get_active_customization() const {
Dictionary result{};
// translate the map to a dictionary of keys and indexes
for (std::pair<String, CustomizationState> const& pair :
this->customization)
result[pair.first] = pair.second.currentSelected.has_value()
? pair.second.currentSelected.value()
: -1; // an invalid key will always be -1
return result;
}
void Player::set_active_customization(Dictionary value) {
for (size_t i = 0; i < value.size(); ++i) {
String key = value.keys()[i];
size_t selection = value[key];
// wether or not the a given key exists in the customization map
bool exists = this->customization.find(key) != this->customization.end();
// 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}, {}}});
// if the key does not exist in customization and _ready is already
// called, the key is not valid and discarted
else if (!exists)
return;
else
this->select_customization(key, selection >= 0
? std::optional{selection}
: std::nullopt);
}
}
Vector3 Player::get_world_move_input() const { Vector3 Player::get_world_move_input() const {
Vector2 n = this->moveInput.normalized(); Vector2 n = this->moveInput.normalized();
return flatViewBasis.get_column(0) * n.x return flatViewBasis.get_column(0) * n.x
@ -138,7 +79,7 @@ void Player::rotate_to_movement() {
this->set_global_transform(trans); this->set_global_transform(trans);
} }
void Player::flat_view_init() { void Player::flat_view_update() {
Basis basis = this->get_viewport()->get_camera_3d()->get_global_transform().get_basis(); Basis basis = this->get_viewport()->get_camera_3d()->get_global_transform().get_basis();
Vector3 right = basis.get_column(0); Vector3 right = basis.get_column(0);
right = Vector3{-right.x, 0, -right.z}.normalized(); right = Vector3{-right.x, 0, -right.z}.normalized();
@ -147,47 +88,7 @@ void Player::flat_view_init() {
this->flatViewBasis = Basis{right, right.cross(forward), forward}; this->flatViewBasis = Basis{right, right.cross(forward), forward};
} }
void Player::customization_init() { bool Player::get_is_moving() const {
this->customizationParent = return this->is_on_floor() && !this->moveInput.is_zero_approx();
this->get_node<Skeleton3D>("Model/RootNode/GeneralSkeleton");
if (this->customizationParent == nullptr)
return;
for (int i = 0; i < customizationParent->get_child_count(); ++i) {
// get the next valid child
Node3D* child = Object::cast_to<Node3D>(this->customizationParent->get_child(i));
if (child == nullptr)
continue;
// split it's name into parts based on _
// the format for the names will be Chr_<CATEGORY NAME>_<ADDITIONAL IDENTIFIERS>_<NUMBER> numbering IS NOT guaranteed to start at 0 OR 1
// the category name will serve as the key to the customization map
// additional identifiers are ignored
PackedStringArray slices = child->get_name().split("_", false);
// create a new customization state if one does not exist for this category
if (this->customization.find(slices[1]) == this->customization.end())
this->customization.insert({slices[1], {std::optional{0}, {}}});
// add the new child to the customization options for this category
CustomizationState& state = this->customization.at(slices[1]);
state.options.push_back(child);
// set invisible if this child is not the current selection
if (state.currentSelected != state.options.size() - 1) {
Player::set_customization_active(child, false);
}
}
// collect customization categories that do not contain any options
std::vector<String> empty{};
for (std::pair<const String, CustomizationState>& pair :
this->customization) {
if (pair.second.options.size() == 0)
empty.push_back(pair.first);
if (pair.second.currentSelected.has_value() &&
pair.second.currentSelected.value() > pair.second.options.size())
pair.second.currentSelected = std::nullopt;
UtilityFunctions::print("- ", pair.first);
}
// remove collected empty categories
for (String const& key : empty) {
this->customization.erase(key);
UtilityFunctions::print("removing ", key);
}
} }
} // namespace godot } // namespace godot

View File

@ -2,36 +2,27 @@
#define PLAYER_HPP #define PLAYER_HPP
#include <map> #include <map>
#include "constants.hpp"
#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/input_event.hpp"
#include "godot_cpp/classes/skeleton3d.hpp" #include "hitable_interface.hpp"
#include "player_input.hpp" #include "player_input.hpp"
#include <optional>
namespace godot { namespace godot {
class Player : public CharacterBody3D { class Player : public CharacterBody3D, public HitableInterface {
GDCLASS(Player, CharacterBody3D) GDCLASS(Player, CharacterBody3D)
static void _bind_methods(); static void _bind_methods();
// the current customization state of a body part/attachment
struct CustomizationState {
std::optional<size_t> currentSelected{std::nullopt}; // current selected option
std::vector<Node3D *> options{}; // cache of all options
};
protected: protected:
// all customization options categorized according to body part
std::map<String, CustomizationState> customization{};
// the root of the character model // the root of the character model
Node3D* model{nullptr}; Node3D* model{nullptr};
// the character animation tree // the character animation tree
AnimationTree* animTree{nullptr}; AnimationTree* animTree{nullptr};
// the skeleton of the customizable character model
Skeleton3D *customizationParent{nullptr};
PlayerInput *input{nullptr}; PlayerInput *input{nullptr};
Basis flatViewBasis{}; Basis flatViewBasis{identity::Basis};
float walkSpeed{4.f}; static float constexpr walkSpeed{4.f};
Vector2 moveInput{0.f, 0.f}; Vector2 moveInput{0.f, 0.f};
@ -41,28 +32,18 @@ public:
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); virtual void damage(Node *origin, int amount) override;
void on_horizontal(Ref<InputEvent> event, float value); void on_horizontal(Ref<InputEvent> event, float value);
void on_vertical(Ref<InputEvent> event, float value); void on_vertical(Ref<InputEvent> event, float value);
// Swap out the currently active customization for this category
void select_customization(String category, std::optional<size_t> value);
// Construct a dictionary of [String, int] where the key is a category
// from the customization map. And the value is the index of the
// active element from the category.
Dictionary get_active_customization() const;
// change active customization as if select_customization was called for
// every element in a [String, int] dictionary, where key is the category
// to assign to and the value is the index of the element to show.
void set_active_customization(Dictionary value);
// returns moveInput transformed to world space // returns moveInput transformed to world space
Vector3 get_world_move_input() const; Vector3 get_world_move_input() const;
private: private:
void rotate_to_movement(); void rotate_to_movement();
void flat_view_init(); void flat_view_update();
void customization_init(); bool get_is_moving() const;
}; };
} // namespace godot } // namespace godot

View File

@ -4,6 +4,7 @@
#include <godot_cpp/core/defs.hpp> #include <godot_cpp/core/defs.hpp>
#include <godot_cpp/godot.hpp> #include <godot_cpp/godot.hpp>
#include "customizable_character.hpp"
#include "entrance.hpp" #include "entrance.hpp"
#include "game_mode.hpp" #include "game_mode.hpp"
#include "level.hpp" #include "level.hpp"
@ -21,6 +22,7 @@ void initialize_gdextension_types(ModuleInitializationLevel p_level) {
ClassDB::register_class<Entrance>(); ClassDB::register_class<Entrance>();
ClassDB::register_class<GameMode>(); ClassDB::register_class<GameMode>();
ClassDB::register_class<PlayerInput>(); ClassDB::register_class<PlayerInput>();
ClassDB::register_class<CustomizableCharacter>();
} }
extern "C" { extern "C" {