Compare commits

..

No commits in common. "f7ea333a90dadf3f2b30390ce854b425158ef22d" and "39ec8e54c968070075c8df2a072e54df4878a347" have entirely different histories.

56 changed files with 467 additions and 30261 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="1.2579205" inkscape:zoom="0.93240622"
inkscape:cx="1779.1267" inkscape:cx="1521.8689"
inkscape:cy="525.47039" inkscape:cy="440.25875"
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,12 +44,7 @@
id="page2" id="page2"
margin="0" margin="0"
bleed="0" /></sodipodi:namedview><defs bleed="0" /></sodipodi:namedview><defs
id="defs1"><rect id="defs1"><marker
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"
@ -255,51 +250,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="tspan5"><tspan id="tspan10"><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan1">Concept</tspan><tspan id="tspan2">Concept</tspan><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan4"> id="tspan9">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="60.32375" y="60.32375"
id="tspan7"><tspan id="tspan12"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan6">3D fixed camera dungeon crawler where the player is placed in a randomly selected sequence of rooms id="tspan11">3D fixed camera dungeon crawler where the player is placed in a randomly selected sequence of rooms
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="76.32375" y="76.32375"
id="tspan12"><tspan id="tspan15"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan11">and asked to clear as many rooms as possible within a 5min timeframe. id="tspan13">and asked to clear as many rooms as possible within a 5min timeframe.
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="92.32375" y="92.32375"
id="tspan15"><tspan id="tspan17"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan13"> id="tspan16">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="108.32375" y="108.32375"
id="tspan17"><tspan id="tspan19"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan16">The environments are an overgrown forest ruin made using a combination of the Nature pack and Prototype assets. id="tspan18">The environments are an overgrown forest ruin made using a combination of the Nature pack and Prototype assets.
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="124.32375" y="124.32375"
id="tspan19"><tspan id="tspan21"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan18"> id="tspan20">
</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="tspan20">The </tspan><tspan id="tspan22">The </tspan><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan21">player</tspan><tspan id="tspan23">player</tspan><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan22"> can move horizontally with the Joystick or WASD. The player has two weapons which id="tspan24"> can move horizontally with the Joystick or WASD. The player has two weapons which
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="156.32375" y="156.32375"
@ -329,7 +324,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">The player can gather score by picking up coins, advancing to the next room, or defeating enemies. id="tspan34">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="236.32375" y="236.32375"
@ -351,300 +346,300 @@
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="284.32375" y="284.32375"
id="tspan46"><tspan id="tspan44"><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan44">&quot;Fodder&quot;</tspan><tspan id="tspan42">&quot;Fodder&quot;</tspan><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan45"> that are slow and die easilly, but if they do end up hitting you they hurt a lot. id="tspan43"> that are slow and die easilly, but if they do end up hitting you they hurt a lot.
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="300.32375" y="300.32375"
id="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="316.32375" y="332.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="332.32375" y="348.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
x="31.84375"
y="348.32375"
id="tspan56"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan55">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="364.32375" y="364.32375"
id="tspan59"><tspan id="tspan55"><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan57">&quot;Tanks&quot;</tspan><tspan id="tspan53">&quot;Tanks&quot;</tspan><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan58"> which don't hit very hard but survive for longer. id="tspan54"> which don't hit very hard but survive for longer.
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="380.32375" y="380.32375"
id="tspan62"><tspan id="tspan57"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan61"> id="tspan56">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="396.32375" y="396.32375"
id="tspan65"><tspan id="tspan59"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan64"> id="tspan58">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="412.32375" y="412.32375"
id="tspan67"><tspan id="tspan61"><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan66"> id="tspan60">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="428.32375" y="428.32375"
id="tspan70"><tspan id="tspan64"><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan68">&quot;Ranged&quot;</tspan><tspan id="tspan62">&quot;Ranged&quot;</tspan><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan69"> which, like fodder have low health, low speed, and like the tank low damage, but can hit from a range. id="tspan63"> which, like fodder have low health, low speed, and like the tank low damage, but can hit from a range.
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="444.32375" y="444.32375"
id="tspan72"><tspan id="tspan66"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan71"> id="tspan65">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="460.32375" y="460.32375"
id="tspan74"><tspan id="tspan68"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan73"> id="tspan67">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="476.32375" y="476.32375"
id="tspan76"><tspan id="tspan70"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan75"> id="tspan69">
</tspan></tspan><tspan </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="492.32375" y="492.32375"
id="tspan78"><tspan id="tspan72"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
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 id="tspan71">There is a &quot;Berserk&quot; powerup which will give the player the power to defeat enemies in one hit for a few seconds, but when it ends it </tspan></tspan><tspan
x="31.84375" x="31.84375"
y="508.32375" y="508.32375"
id="tspan80"><tspan id="tspan74"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
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 id="tspan73">leaves the player unable to act for a second.
</tspan></tspan><tspan
x="31.84375" x="31.84375"
y="524.32375" y="524.32375"
id="tspan84"><tspan id="tspan76"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
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 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" x="31.84375"
y="540.32375" y="540.32375"
id="tspan140"><tspan id="tspan78"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" 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 id="tspan77">
</tspan></tspan><tspan
x="31.84375" x="31.84375"
y="556.32375" y="556.32375"
id="tspan142"><tspan id="tspan80"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'" 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 id="tspan79">There is a &quot;speedup&quot; powerup, which will increase the animation/movement speed for the player but drains health while active (always </tspan></tspan><tspan
x="31.84375"
y="572.32375"
id="tspan84"><tspan
style="-inkscape-font-specification:'IBM Plex Sans, Normal'"
id="tspan81">leaving a small amount to avoid frustrating deaths).</tspan></tspan></text><text
xml:space="preserve" xml:space="preserve"
transform="matrix(0.26458333,0,0,0.26458333,-5.8858161,-9.7341241)" transform="matrix(0.26458333,0,0,0.26458333,-5.8858161,-9.7341241)"
id="text3" id="text3"
style="font-size:16px;line-height:1;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans, Normal';text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect3);shape-padding:23.7099;display:inline;fill:#1b1b1b;stroke-width:3.00094;stroke-linejoin:round"><tspan style="font-size:16px;line-height:1;font-family:'IBM Plex Sans';-inkscape-font-specification:'IBM Plex Sans, Normal';text-decoration-color:#000000;white-space:pre;shape-inside:url(#rect3);shape-padding:23.7099;display:inline;fill:#1b1b1b;stroke-width:3.00094;stroke-linejoin:round"><tspan
x="1205.7305" x="1205.7305"
y="71.800313" y="71.800313"
id="tspan150"><tspan id="tspan87"><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan143">Player: id="tspan85">Player:
</tspan></tspan><tspan </tspan></tspan><tspan
x="1205.7305" x="1205.7305"
y="87.800313" y="87.800313"
id="tspan153">- A warrior with an axe and a sword. id="tspan88">- A warrior with an axe and a sword.
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="103.80031" y="103.80031"
id="tspan154"> id="tspan89">
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="119.80031" y="119.80031"
id="tspan156"><tspan id="tspan91"><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan155">Objectives: id="tspan90">Objectives:
</tspan></tspan><tspan </tspan></tspan><tspan
x="1205.7305" x="1205.7305"
y="135.80031" y="135.80031"
id="tspan158">- Defeat all enemies.<tspan id="tspan94">- Defeat all enemies.<tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan157"> id="tspan93">
</tspan></tspan><tspan </tspan></tspan><tspan
x="1205.7305" x="1205.7305"
y="151.80031" y="151.80031"
id="tspan159">- Move to the next room. id="tspan95">- Move to the next room.
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="167.80031" y="167.80031"
id="tspan160"> id="tspan96">
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="183.80031" y="183.80031"
id="tspan162"><tspan id="tspan99"><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan161">Resources: id="tspan98">Resources:
</tspan></tspan><tspan </tspan></tspan><tspan
x="1205.7305" x="1205.7305"
y="199.80031" y="199.80031"
id="tspan163">- Health, depending on what they get hit by, the player can take 4-7 hits id="tspan100">- Health, depending on what they get hit by, the player can take 4-7 hits
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="215.80031" y="215.80031"
id="tspan164">- Time, 5 minutes id="tspan101">- Time, 5 minutes
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="231.80031" y="231.80031"
id="tspan165"> id="tspan102">
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="247.80031" y="247.80031"
id="tspan167"><tspan id="tspan104"><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan166">Mechanics: id="tspan103">Mechanics:
</tspan></tspan><tspan </tspan></tspan><tspan
x="1205.7305" x="1205.7305"
y="263.80031" y="263.80031"
id="tspan168">- Short/light/weak attack with the axe id="tspan105">- Short/light/weak attack with the axe
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="279.80031" y="279.80031"
id="tspan169">- Long/heavy/strong attack with the sword id="tspan106">- Long/heavy/strong attack with the sword
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="295.80031" y="295.80031"
id="tspan170">- Berserk powerup that has a long vulnerablility period at the end id="tspan108">- Berserk powerup that has a long vulnerablility period at the end
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="311.80031" y="311.80031"
id="tspan171">- Speed powerup that saps in the ballpark of 30% of the player's max health id="tspan109">- Speed powerup that saps in the ballpark of 30% of the player's max health
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="327.80031" y="327.80031"
id="tspan172">- Explosion Powerup that clears a large number of enemies but powers up those that survive id="tspan110">- The game timer ticks down to game over
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="343.80031" y="343.80031"
id="tspan173">- The game timer ticks down to game over id="tspan111">- Rooms will spawn enemies in randomly selected waves.
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="359.80031" y="359.80031"
id="tspan174">- Rooms will spawn enemies in randomly selected waves. id="tspan112">- Progress requires killing all waves of enemies
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="375.80031" y="375.80031"
id="tspan175">- Progress requires killing all waves of enemies id="tspan113">
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="391.80031" y="391.80031"
id="tspan176"> id="tspan116"><tspan
</tspan><tspan
x="1205.7305"
y="407.80031"
id="tspan178"><tspan
style="font-weight:bold" style="font-weight:bold"
id="tspan177">Dynamics: id="tspan114">Dynamics:
</tspan></tspan><tspan </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
x="1205.7305" x="1205.7305"
y="423.80031" y="423.80031"
id="tspan179">- The player has to decide whether to short or long attack based on their windup/recovery durations. id="tspan118"> - deciding to use a long when you shouldn't would lead to getting hit during windup (canceling the action) or during winddown.
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="439.80031" y="439.80031"
id="tspan180"> - deciding to use a long when you shouldn't would lead to getting hit during windup (canceling the action) or during winddown. id="tspan119"> - But a light attack could fail to eliminate a threat in time.
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="455.80031" y="455.80031"
id="tspan181"> - But a light attack could fail to eliminate a threat in time. id="tspan120">- The player can make heavy attacks more useful by finding a speedup, but that goes at the cost of health.
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="471.80031" y="471.80031"
id="tspan182">- The player can make heavy attacks more useful by finding a speedup, but that goes at the cost of health. id="tspan121">- The player can make light attacks more useful by finding a berserk powerup, but at the risk of leaving themselves exposed after it fails.
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="487.80031" y="487.80031"
id="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. id="tspan122">
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="503.80031" y="503.80031"
id="tspan184">- In a panic the player can use the explosion powerup, but if used carelessly this will make the game harder id="tspan124"><tspan
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="tspan185"> id="tspan125">- The player cannot progress without defeating enemies.
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="535.80031" y="535.80031"
id="tspan187"><tspan id="tspan126">- The enemies will attack the player.
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="tspan188">- The player cannot progress without defeating enemies. id="tspan127">
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="567.80031" y="567.80031"
id="tspan189">- The enemies will attack the player. id="tspan129"><tspan
</tspan><tspan style="font-weight:bold"
id="tspan128">Boundaries:
</tspan></tspan><tspan
x="1205.7305" x="1205.7305"
y="583.80031" y="583.80031"
id="tspan190"> id="tspan130">- The player cannot leave the room they're in until all enemies are defeated.
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="599.80031" y="599.80031"
id="tspan192"><tspan id="tspan131">- The player cannot stop an attack until it's animation is finished.
style="font-weight:bold" </tspan><tspan
id="tspan191">Boundaries:
</tspan></tspan><tspan
x="1205.7305" x="1205.7305"
y="615.80031" y="615.80031"
id="tspan193">- The player cannot leave the room they're in until all enemies are defeated. id="tspan132">
</tspan><tspan </tspan><tspan
x="1205.7305" x="1205.7305"
y="631.80031" y="631.80031"
id="tspan194">- The player cannot stop an attack until it's animation is finished. id="tspan134"><tspan
</tspan><tspan style="font-weight:bold"
id="tspan133">Outcome:
</tspan></tspan><tspan
x="1205.7305" x="1205.7305"
y="647.80031" y="647.80031"
id="tspan195"> id="tspan136">- The game ends when the player runs out of time or health<tspan
</tspan><tspan style="font-weight:bold"
id="tspan135">
</tspan></tspan><tspan
x="1205.7305" x="1205.7305"
y="663.80031" y="663.80031"
id="tspan197"><tspan id="tspan137">- The player is scored based on the number of enemies defeated
style="font-weight:bold"
id="tspan196">Outcome:
</tspan></tspan><tspan
x="1205.7305"
y="679.80031"
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 </tspan><tspan
x="1205.7305" x="1205.7305"
y="711.80031" y="679.80031"
id="tspan201">- After the game end screen, the game is reset for the next person. </tspan></text><image id="tspan138">- After the game end screen, the game is reset for the next person. </tspan></text><image
width="13.64728" width="13.64728"
height="27.455114" height="27.455114"
preserveAspectRatio="none" preserveAspectRatio="none"
@ -885,9 +880,84 @@
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><g y="46.607197">Four hits to death</tspan></text></g><rect
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(-17.002033,-73.99137)"><g transform="translate(21.068403,-44.544624)"><g
id="g151" id="g151"
transform="translate(30.606929,3.6243846)"><g transform="translate(30.606929,3.6243846)"><g
id="g150" id="g150"
@ -995,115 +1065,14 @@
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><g y="136.34253">light</tspan></text></g></g><text
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="503.0347" x="500.92786"
y="162.0376" y="162.23825"
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="503.0347" x="500.92786"
y="162.0376">Secondary Game Loop</tspan></text></g><image y="162.23825">Secondary Game Loop</tspan></text></g></svg>
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: 47 KiB

After

Width:  |  Height:  |  Size: 46 KiB

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

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=18 format=3 uid="uid://3qb27d8vkjku"] [gd_scene load_steps=13 format=3 uid="uid://3qb27d8vkjku"]
[ext_resource type="LightmapGIData" uid="uid://cfli7rodl51qd" path="res://Levels/Light/room001.lmbake" id="1_vp3o5"] [ext_resource type="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,11 +9,6 @@
[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"]
@ -25,7 +20,6 @@ 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"]
@ -132,219 +126,3 @@ 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"]

Binary file not shown.

File diff suppressed because it is too large Load Diff

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

Binary file not shown.

View File

@ -1,77 +0,0 @@
[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

@ -1,10 +0,0 @@
[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

@ -1,8 +0,0 @@
[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

@ -1,10 +0,0 @@
[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

@ -1,10 +0,0 @@
[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

@ -1,10 +0,0 @@
[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

@ -1,10 +0,0 @@
[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

@ -1,13 +0,0 @@
[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

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

View File

@ -1,10 +0,0 @@
[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

@ -1,13 +0,0 @@
[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="CustomizableCharacter" nodes/root_type=""
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/mod_chars_1.tres" "use_external/path": "res://Models/Characters/Materials/lambert2.tres"
}, },
"lambert3": { "lambert3": {
"use_external/enabled": true, "use_external/enabled": true,
"use_external/path": "res://Models/Characters/Materials/mod_chars_2.tres" "use_external/path": "res://Models/Characters/Materials/lambert3.tres"
} }
}, },
"nodes": { "nodes": {

Binary file not shown.

View File

@ -1,35 +0,0 @@
[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

@ -1,34 +0,0 @@
[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

@ -1,34 +0,0 @@
[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

@ -1,34 +0,0 @@
[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

View File

@ -1,35 +0,0 @@
[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,9 +4,10 @@
[resource] [resource]
resource_name = "Texture_01" resource_name = "Texture_01"
albedo_color = Color(0.305882, 0.478431, 0.427451, 1) albedo_color = Color(1, 0.819608, 0.219608, 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

@ -1,12 +0,0 @@
[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

@ -1,12 +0,0 @@
[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

Binary file not shown.

View File

@ -1,41 +0,0 @@
[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

Binary file not shown.

View File

@ -1,41 +0,0 @@
[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)

Binary file not shown.

View File

@ -1,34 +0,0 @@
[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,26 +3,25 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://daxuhceq1xp8e" uid="uid://daxuhceq1xp8e"
path.s3tc="res://.godot/imported/Skybox_No_Snow_Diff.png-4aac1df060d706f7f84d7e011badea7b.s3tc.ctex" path="res://.godot/imported/Skybox_No_Snow_Diff.png-4aac1df060d706f7f84d7e011badea7b.ctex"
metadata={ metadata={
"imported_formats": ["s3tc_bptc"], "vram_texture": false
"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.s3tc.ctex"] dest_files=["res://.godot/imported/Skybox_No_Snow_Diff.png-4aac1df060d706f7f84d7e011badea7b.ctex"]
[params] [params]
compress/mode=2 compress/mode=0
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=true mipmaps/generate=false
mipmaps/limit=-1 mipmaps/limit=-1
roughness/mode=0 roughness/mode=0
roughness/src_normal="" roughness/src_normal=""
@ -32,4 +31,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=0 detect_3d/compress_to=1

View File

@ -3,33 +3,32 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://cbgfiq60qi04y" uid="uid://cbgfiq60qi04y"
path.s3tc="res://.godot/imported/Skybox_Normal.png-0298afdd81d923bbadde428f4cf9fcc0.s3tc.ctex" path="res://.godot/imported/Skybox_Normal.png-0298afdd81d923bbadde428f4cf9fcc0.ctex"
metadata={ metadata={
"imported_formats": ["s3tc_bptc"], "vram_texture": false
"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.s3tc.ctex"] dest_files=["res://.godot/imported/Skybox_Normal.png-0298afdd81d923bbadde428f4cf9fcc0.ctex"]
[params] [params]
compress/mode=2 compress/mode=0
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=1 compress/normal_map=0
compress/channel_pack=0 compress/channel_pack=0
mipmaps/generate=true mipmaps/generate=false
mipmaps/limit=-1 mipmaps/limit=-1
roughness/mode=1 roughness/mode=0
roughness/src_normal="res://Models/Sky/Skybox_Normal.png" roughness/src_normal=""
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=0 detect_3d/compress_to=1

View File

@ -1,10 +1,7 @@
[gd_resource type="StandardMaterial3D" load_steps=3 format=3 uid="uid://bmmdcphiyb35f"] [gd_resource type="StandardMaterial3D" load_steps=2 format=3 uid="uid://bmmdcphiyb35f"]
[ext_resource type="Texture2D" uid="uid://fd8740pp6c65" path="res://Models/Sky/Skybox_Diff.png" id="1_mcq4h"] [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="SM_Prop_Sword" nodes/root_name=""
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)

Binary file not shown.

View File

@ -1,53 +0,0 @@
[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,9 +1,7 @@
[gd_scene load_steps=15 format=3 uid="uid://dw8q1vqnc657"] [gd_scene load_steps=10 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"
@ -332,64 +330,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(-578.579, 250.949) graph_offset = Vector2(-154, 108)
nodes/Idle/node = SubResource("AnimationNodeAnimation_3b5eb") nodes/Animation/node = SubResource("AnimationNodeAnimation_3b5eb")
nodes/Idle/position = Vector2(-320, 140) nodes/Animation/position = Vector2(-320, 140)
nodes/IdleWalkBlend/node = SubResource("AnimationNodeBlend2_5ua7i") node_connections = [&"output", 0, &"Animation"]
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/Idle/node = SubResource("AnimationNodeBlendTree_idcvn") states/BlendTree/node = SubResource("AnimationNodeBlendTree_idcvn")
states/Idle/position = Vector2(389, 112) states/BlendTree/position = Vector2(389, 112)
states/Start/position = Vector2(227, 112) states/Start/position = Vector2(227, 112)
transitions = ["Start", "Idle", SubResource("AnimationNodeStateMachineTransition_5wf40")] transitions = ["Start", "BlendTree", 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)
@ -398,46 +396,20 @@ 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.0064089, 0.824015, -0.0161932) bones/1/position = Vector3(0.00799814, 0.822939, -0.0170919)
bones/1/rotation = Quaternion(-0.0186555, -0.0848505, 0.0122633, 0.996144) bones/1/rotation = Quaternion(-0.0173024, -0.0769098, 0.00854839, 0.996851)
bones/2/rotation = Quaternion(0.00877745, 0.00637038, 0.000268667, 0.999941) bones/2/rotation = Quaternion(0.00896411, 0.00637054, 0.000265095, 0.99994)
bones/3/rotation = Quaternion(0.00861796, 0.00637028, 0.0002716, 0.999943) bones/3/rotation = Quaternion(0.00882963, 0.00637047, 0.000267564, 0.999941)
bones/4/rotation = Quaternion(0.0088558, 0.00637049, 0.000267043, 0.99994) bones/4/rotation = Quaternion(0.00907812, 0.00637071, 0.000262791, 0.999939)
bones/5/rotation = Quaternion(-0.0139191, 0.0328765, -0.00679956, 0.999339) bones/5/rotation = Quaternion(-0.0130848, 0.0288738, -0.00513406, 0.999484)
bones/6/rotation = Quaternion(-0.0139146, 0.0328705, -0.00679594, 0.99934) bones/6/rotation = Quaternion(-0.0130942, 0.0288758, -0.00513693, 0.999484)
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.247455, 0.839095, -0.458569, -0.156207) bones/11/rotation = Quaternion(0.24205, 0.842133, -0.4545, -0.160169)
bones/12/rotation = Quaternion(-0.039877, -0.696571, -0.0402117, 0.715249) bones/12/rotation = Quaternion(-0.0282314, -0.699896, -0.0284688, 0.713119)
bones/13/rotation = Quaternion(-0.0420627, 0.558109, -0.139609, 0.816857) bones/13/rotation = Quaternion(-0.0439467, 0.565119, -0.143898, 0.811174)
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)
@ -448,9 +420,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.115133, 0.860735, -0.451588, 0.20481) bones/28/rotation = Quaternion(-0.125884, 0.859315, -0.455472, 0.195646)
bones/29/rotation = Quaternion(0.0209625, 0.711686, -0.0211379, 0.701867) bones/29/rotation = Quaternion(0.0109876, 0.709589, -0.0110795, 0.704443)
bones/30/rotation = Quaternion(0.00773145, -0.600065, 0.0707188, 0.796782) bones/30/rotation = Quaternion(0.0112271, -0.589384, 0.0652025, 0.805139)
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)
@ -460,19 +432,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.0826276, 0.0457204, 0.991888, 0.085091) bones/50/rotation = Quaternion(-0.0911938, 0.0463263, 0.991272, 0.0831711)
bones/50/scale = Vector3(1.00002, 0.999999, 1) bones/50/scale = Vector3(1.00002, 0.999999, 1)
bones/51/rotation = Quaternion(0.00967221, 0.960188, -0.27917, -0.00298206) bones/51/rotation = Quaternion(0.00970492, 0.959913, -0.280113, -0.0029922)
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.0778185, 0.536789, -0.839965, -0.0161634) bones/52/rotation = Quaternion(0.0792991, 0.536526, -0.839989, -0.0164049)
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.188468, 0.132146, 0.969868, -0.079841) bones/56/rotation = Quaternion(0.179453, 0.139217, 0.970475, -0.0811989)
bones/56/scale = Vector3(1.00002, 0.999999, 1) bones/56/scale = Vector3(1.00002, 0.999999, 1)
bones/57/rotation = Quaternion(-0.0100069, 0.957327, -0.288819, 0.00308538) bones/57/rotation = Quaternion(-0.0102556, 0.955128, -0.295999, 0.00316205)
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.069029, 0.610718, -0.78851, 0.0226031) bones/58/rotation = Quaternion(-0.0675913, 0.607901, -0.790822, 0.0220936)
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)
@ -600,9 +572,6 @@ 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
@ -717,9 +686,6 @@ 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
@ -870,9 +836,6 @@ 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
@ -888,6 +851,9 @@ 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
@ -903,6 +869,9 @@ 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
@ -924,10 +893,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_04" parent="Model/RootNode/GeneralSkeleton" index="151"] [node name="Chr_HipsAttachment_05" parent="Model/RootNode/GeneralSkeleton" index="152"]
visible = false visible = false
[node name="Chr_HipsAttachment_05" parent="Model/RootNode/GeneralSkeleton" index="152"] [node name="Chr_HipsAttachment_06" parent="Model/RootNode/GeneralSkeleton" index="153"]
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"]
@ -1047,6 +1016,9 @@ 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
@ -1065,9 +1037,6 @@ 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
@ -1128,7 +1097,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_01" parent="Model/RootNode/GeneralSkeleton" index="221"] [node name="Chr_Eyebrow_Female_02" parent="Model/RootNode/GeneralSkeleton" index="222"]
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"]
@ -1161,7 +1130,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_05" parent="Model/RootNode/GeneralSkeleton" index="233"] [node name="Chr_Torso_Female_06" parent="Model/RootNode/GeneralSkeleton" index="234"]
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"]
@ -1233,10 +1202,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_02" parent="Model/RootNode/GeneralSkeleton" index="259"] [node name="Chr_ArmUpperRight_Female_01" parent="Model/RootNode/GeneralSkeleton" index="258"]
visible = false visible = false
[node name="Chr_ArmUpperRight_Female_03" parent="Model/RootNode/GeneralSkeleton" index="260"] [node name="Chr_ArmUpperRight_Female_02" parent="Model/RootNode/GeneralSkeleton" index="259"]
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"]
@ -1359,10 +1328,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_03" parent="Model/RootNode/GeneralSkeleton" index="302"] [node name="Chr_ArmLowerRight_Female_04" parent="Model/RootNode/GeneralSkeleton" index="303"]
visible = false visible = false
[node name="Chr_ArmLowerRight_Female_04" parent="Model/RootNode/GeneralSkeleton" index="303"] [node name="Chr_ArmLowerRight_Female_05" parent="Model/RootNode/GeneralSkeleton" index="304"]
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"]
@ -1410,15 +1379,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
@ -1461,15 +1430,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
@ -1509,7 +1478,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_00" parent="Model/RootNode/GeneralSkeleton" index="355"] [node name="Chr_HandLeft_Female_01" parent="Model/RootNode/GeneralSkeleton" index="356"]
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"]
@ -1566,7 +1535,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_03" parent="Model/RootNode/GeneralSkeleton" index="376"] [node name="Chr_Hips_Female_02" parent="Model/RootNode/GeneralSkeleton" index="375"]
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"]
@ -1662,6 +1631,9 @@ 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
@ -1677,9 +1649,6 @@ 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
@ -1719,6 +1688,9 @@ 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
@ -1734,9 +1706,6 @@ 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
@ -1761,9 +1730,7 @@ 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

@ -1,115 +0,0 @@
#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

@ -1,45 +0,0 @@
#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

View File

@ -1,12 +0,0 @@
#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,9 +14,11 @@
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() {
@ -27,8 +29,9 @@ void Player::_enter_tree() {
} }
void Player::_ready() { void Player::_ready() {
this->customization_init();
GDGAMEONLY(); GDGAMEONLY();
this->flat_view_update(); this->flat_view_init();
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"));
} }
@ -51,17 +54,73 @@ void Player::_physics_process(double deltaTime) {
this->move_and_slide(); this->move_and_slide();
} }
void Player::damage(Node *origin, int amount) { void Player::set_customization_active(Node3D *node, bool active) {
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
@ -79,7 +138,7 @@ void Player::rotate_to_movement() {
this->set_global_transform(trans); this->set_global_transform(trans);
} }
void Player::flat_view_update() { void Player::flat_view_init() {
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();
@ -88,7 +147,47 @@ void Player::flat_view_update() {
this->flatViewBasis = Basis{right, right.cross(forward), forward}; this->flatViewBasis = Basis{right, right.cross(forward), forward};
} }
bool Player::get_is_moving() const { void Player::customization_init() {
return this->is_on_floor() && !this->moveInput.is_zero_approx(); this->customizationParent =
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,27 +2,36 @@
#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 "hitable_interface.hpp" #include "godot_cpp/classes/skeleton3d.hpp"
#include "player_input.hpp" #include "player_input.hpp"
#include <optional>
namespace godot { namespace godot {
class Player : public CharacterBody3D, public HitableInterface { class Player : public CharacterBody3D {
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{identity::Basis}; Basis flatViewBasis{};
static float constexpr walkSpeed{4.f}; float walkSpeed{4.f};
Vector2 moveInput{0.f, 0.f}; Vector2 moveInput{0.f, 0.f};
@ -32,18 +41,28 @@ 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;
virtual void damage(Node *origin, int amount) override; static void set_customization_active(Node3D *node, bool active);
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_update(); void flat_view_init();
bool get_is_moving() const; void customization_init();
}; };
} // namespace godot } // namespace godot

View File

@ -4,7 +4,6 @@
#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"
@ -22,7 +21,6 @@ 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" {