Tweaked some numbers to get a better "swarm"
This commit is contained in:
BIN
.build/html.zip
Normal file
BIN
.build/html.zip
Normal file
Binary file not shown.
BIN
.build/html/index.apple-touch-icon.png
Normal file
BIN
.build/html/index.apple-touch-icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 20 KiB |
213
.build/html/index.audio.worklet.js
Normal file
213
.build/html/index.audio.worklet.js
Normal file
@@ -0,0 +1,213 @@
|
||||
/**************************************************************************/
|
||||
/* audio.worklet.js */
|
||||
/**************************************************************************/
|
||||
/* This file is part of: */
|
||||
/* GODOT ENGINE */
|
||||
/* https://godotengine.org */
|
||||
/**************************************************************************/
|
||||
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
|
||||
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
|
||||
/* */
|
||||
/* Permission is hereby granted, free of charge, to any person obtaining */
|
||||
/* a copy of this software and associated documentation files (the */
|
||||
/* "Software"), to deal in the Software without restriction, including */
|
||||
/* without limitation the rights to use, copy, modify, merge, publish, */
|
||||
/* distribute, sublicense, and/or sell copies of the Software, and to */
|
||||
/* permit persons to whom the Software is furnished to do so, subject to */
|
||||
/* the following conditions: */
|
||||
/* */
|
||||
/* The above copyright notice and this permission notice shall be */
|
||||
/* included in all copies or substantial portions of the Software. */
|
||||
/* */
|
||||
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
|
||||
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
|
||||
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
|
||||
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
|
||||
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
|
||||
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
|
||||
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
|
||||
/**************************************************************************/
|
||||
|
||||
class RingBuffer {
|
||||
constructor(p_buffer, p_state, p_threads) {
|
||||
this.buffer = p_buffer;
|
||||
this.avail = p_state;
|
||||
this.threads = p_threads;
|
||||
this.rpos = 0;
|
||||
this.wpos = 0;
|
||||
}
|
||||
|
||||
data_left() {
|
||||
return this.threads ? Atomics.load(this.avail, 0) : this.avail;
|
||||
}
|
||||
|
||||
space_left() {
|
||||
return this.buffer.length - this.data_left();
|
||||
}
|
||||
|
||||
read(output) {
|
||||
const size = this.buffer.length;
|
||||
let from = 0;
|
||||
let to_write = output.length;
|
||||
if (this.rpos + to_write > size) {
|
||||
const high = size - this.rpos;
|
||||
output.set(this.buffer.subarray(this.rpos, size));
|
||||
from = high;
|
||||
to_write -= high;
|
||||
this.rpos = 0;
|
||||
}
|
||||
if (to_write) {
|
||||
output.set(this.buffer.subarray(this.rpos, this.rpos + to_write), from);
|
||||
}
|
||||
this.rpos += to_write;
|
||||
if (this.threads) {
|
||||
Atomics.add(this.avail, 0, -output.length);
|
||||
Atomics.notify(this.avail, 0);
|
||||
} else {
|
||||
this.avail -= output.length;
|
||||
}
|
||||
}
|
||||
|
||||
write(p_buffer) {
|
||||
const to_write = p_buffer.length;
|
||||
const mw = this.buffer.length - this.wpos;
|
||||
if (mw >= to_write) {
|
||||
this.buffer.set(p_buffer, this.wpos);
|
||||
this.wpos += to_write;
|
||||
if (mw === to_write) {
|
||||
this.wpos = 0;
|
||||
}
|
||||
} else {
|
||||
const high = p_buffer.subarray(0, mw);
|
||||
const low = p_buffer.subarray(mw);
|
||||
this.buffer.set(high, this.wpos);
|
||||
this.buffer.set(low);
|
||||
this.wpos = low.length;
|
||||
}
|
||||
if (this.threads) {
|
||||
Atomics.add(this.avail, 0, to_write);
|
||||
Atomics.notify(this.avail, 0);
|
||||
} else {
|
||||
this.avail += to_write;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class GodotProcessor extends AudioWorkletProcessor {
|
||||
constructor() {
|
||||
super();
|
||||
this.threads = false;
|
||||
this.running = true;
|
||||
this.lock = null;
|
||||
this.notifier = null;
|
||||
this.output = null;
|
||||
this.output_buffer = new Float32Array();
|
||||
this.input = null;
|
||||
this.input_buffer = new Float32Array();
|
||||
this.port.onmessage = (event) => {
|
||||
const cmd = event.data['cmd'];
|
||||
const data = event.data['data'];
|
||||
this.parse_message(cmd, data);
|
||||
};
|
||||
}
|
||||
|
||||
process_notify() {
|
||||
if (this.notifier) {
|
||||
Atomics.add(this.notifier, 0, 1);
|
||||
Atomics.notify(this.notifier, 0);
|
||||
}
|
||||
}
|
||||
|
||||
parse_message(p_cmd, p_data) {
|
||||
if (p_cmd === 'start' && p_data) {
|
||||
const state = p_data[0];
|
||||
let idx = 0;
|
||||
this.threads = true;
|
||||
this.lock = state.subarray(idx, ++idx);
|
||||
this.notifier = state.subarray(idx, ++idx);
|
||||
const avail_in = state.subarray(idx, ++idx);
|
||||
const avail_out = state.subarray(idx, ++idx);
|
||||
this.input = new RingBuffer(p_data[1], avail_in, true);
|
||||
this.output = new RingBuffer(p_data[2], avail_out, true);
|
||||
} else if (p_cmd === 'stop') {
|
||||
this.running = false;
|
||||
this.output = null;
|
||||
this.input = null;
|
||||
this.lock = null;
|
||||
this.notifier = null;
|
||||
} else if (p_cmd === 'start_nothreads') {
|
||||
this.output = new RingBuffer(p_data[0], p_data[0].length, false);
|
||||
} else if (p_cmd === 'chunk') {
|
||||
this.output.write(p_data);
|
||||
}
|
||||
}
|
||||
|
||||
static array_has_data(arr) {
|
||||
return arr.length && arr[0].length && arr[0][0].length;
|
||||
}
|
||||
|
||||
process(inputs, outputs, parameters) {
|
||||
if (!this.running) {
|
||||
return false; // Stop processing.
|
||||
}
|
||||
if (this.output === null) {
|
||||
return true; // Not ready yet, keep processing.
|
||||
}
|
||||
const process_input = GodotProcessor.array_has_data(inputs);
|
||||
if (process_input) {
|
||||
const input = inputs[0];
|
||||
const chunk = input[0].length * input.length;
|
||||
if (this.input_buffer.length !== chunk) {
|
||||
this.input_buffer = new Float32Array(chunk);
|
||||
}
|
||||
if (!this.threads) {
|
||||
GodotProcessor.write_input(this.input_buffer, input);
|
||||
this.port.postMessage({ 'cmd': 'input', 'data': this.input_buffer });
|
||||
} else if (this.input.space_left() >= chunk) {
|
||||
GodotProcessor.write_input(this.input_buffer, input);
|
||||
this.input.write(this.input_buffer);
|
||||
} else {
|
||||
// this.port.postMessage('Input buffer is full! Skipping input frame.'); // Uncomment this line to debug input buffer.
|
||||
}
|
||||
}
|
||||
const process_output = GodotProcessor.array_has_data(outputs);
|
||||
if (process_output) {
|
||||
const output = outputs[0];
|
||||
const chunk = output[0].length * output.length;
|
||||
if (this.output_buffer.length !== chunk) {
|
||||
this.output_buffer = new Float32Array(chunk);
|
||||
}
|
||||
if (this.output.data_left() >= chunk) {
|
||||
this.output.read(this.output_buffer);
|
||||
GodotProcessor.write_output(output, this.output_buffer);
|
||||
if (!this.threads) {
|
||||
this.port.postMessage({ 'cmd': 'read', 'data': chunk });
|
||||
}
|
||||
} else {
|
||||
// this.port.postMessage('Output buffer has not enough frames! Skipping output frame.'); // Uncomment this line to debug output buffer.
|
||||
}
|
||||
}
|
||||
this.process_notify();
|
||||
return true;
|
||||
}
|
||||
|
||||
static write_output(dest, source) {
|
||||
const channels = dest.length;
|
||||
for (let ch = 0; ch < channels; ch++) {
|
||||
for (let sample = 0; sample < dest[ch].length; sample++) {
|
||||
dest[ch][sample] = source[sample * channels + ch];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static write_input(dest, source) {
|
||||
const channels = source.length;
|
||||
for (let ch = 0; ch < channels; ch++) {
|
||||
for (let sample = 0; sample < source[ch].length; sample++) {
|
||||
dest[sample * channels + ch] = source[ch][sample];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
registerProcessor('godot-processor', GodotProcessor);
|
||||
199
.build/html/index.html
Normal file
199
.build/html/index.html
Normal file
@@ -0,0 +1,199 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0">
|
||||
<title>RomAnts</title>
|
||||
<style>
|
||||
html, body, #canvas {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
body {
|
||||
color: white;
|
||||
background-color: black;
|
||||
overflow: hidden;
|
||||
touch-action: none;
|
||||
}
|
||||
|
||||
#canvas {
|
||||
display: block;
|
||||
}
|
||||
|
||||
#canvas:focus {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
#status, #status-splash, #status-progress {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
#status, #status-splash {
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
}
|
||||
|
||||
#status {
|
||||
background-color: #242424;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
#status-splash {
|
||||
max-height: 100%;
|
||||
max-width: 100%;
|
||||
margin: auto;
|
||||
}
|
||||
|
||||
#status-progress, #status-notice {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#status-progress {
|
||||
bottom: 10%;
|
||||
width: 50%;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
#status-notice {
|
||||
background-color: #5b3943;
|
||||
border-radius: 0.5rem;
|
||||
border: 1px solid #9b3943;
|
||||
color: #e0e0e0;
|
||||
font-family: 'Noto Sans', 'Droid Sans', Arial, sans-serif;
|
||||
line-height: 1.3;
|
||||
margin: 0 2rem;
|
||||
overflow: hidden;
|
||||
padding: 1rem;
|
||||
text-align: center;
|
||||
z-index: 1;
|
||||
}
|
||||
</style>
|
||||
<link id="-gd-engine-icon" rel="icon" type="image/png" href="index.icon.png" />
|
||||
<link rel="apple-touch-icon" href="index.apple-touch-icon.png"/>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<canvas id="canvas">
|
||||
Your browser does not support the canvas tag.
|
||||
</canvas>
|
||||
|
||||
<noscript>
|
||||
Your browser does not support JavaScript.
|
||||
</noscript>
|
||||
|
||||
<div id="status">
|
||||
<img id="status-splash" src="index.png" alt="">
|
||||
<progress id="status-progress"></progress>
|
||||
<div id="status-notice"></div>
|
||||
</div>
|
||||
|
||||
<script src="index.js"></script>
|
||||
<script>
|
||||
const GODOT_CONFIG = {"args":[],"canvasResizePolicy":2,"ensureCrossOriginIsolationHeaders":true,"executable":"index","experimentalVK":false,"fileSizes":{"index.pck":11490448,"index.wasm":35376909},"focusCanvas":true,"gdextensionLibs":[]};
|
||||
const GODOT_THREADS_ENABLED = false;
|
||||
const engine = new Engine(GODOT_CONFIG);
|
||||
|
||||
(function () {
|
||||
const statusOverlay = document.getElementById('status');
|
||||
const statusProgress = document.getElementById('status-progress');
|
||||
const statusNotice = document.getElementById('status-notice');
|
||||
|
||||
let initializing = true;
|
||||
let statusMode = '';
|
||||
|
||||
function setStatusMode(mode) {
|
||||
if (statusMode === mode || !initializing) {
|
||||
return;
|
||||
}
|
||||
if (mode === 'hidden') {
|
||||
statusOverlay.remove();
|
||||
initializing = false;
|
||||
return;
|
||||
}
|
||||
statusOverlay.style.visibility = 'visible';
|
||||
statusProgress.style.display = mode === 'progress' ? 'block' : 'none';
|
||||
statusNotice.style.display = mode === 'notice' ? 'block' : 'none';
|
||||
statusMode = mode;
|
||||
}
|
||||
|
||||
function setStatusNotice(text) {
|
||||
while (statusNotice.lastChild) {
|
||||
statusNotice.removeChild(statusNotice.lastChild);
|
||||
}
|
||||
const lines = text.split('\n');
|
||||
lines.forEach((line) => {
|
||||
statusNotice.appendChild(document.createTextNode(line));
|
||||
statusNotice.appendChild(document.createElement('br'));
|
||||
});
|
||||
}
|
||||
|
||||
function displayFailureNotice(err) {
|
||||
console.error(err);
|
||||
if (err instanceof Error) {
|
||||
setStatusNotice(err.message);
|
||||
} else if (typeof err === 'string') {
|
||||
setStatusNotice(err);
|
||||
} else {
|
||||
setStatusNotice('An unknown error occured');
|
||||
}
|
||||
setStatusMode('notice');
|
||||
initializing = false;
|
||||
}
|
||||
|
||||
const missing = Engine.getMissingFeatures({
|
||||
threads: GODOT_THREADS_ENABLED,
|
||||
});
|
||||
|
||||
if (missing.length !== 0) {
|
||||
if (GODOT_CONFIG['serviceWorker'] && GODOT_CONFIG['ensureCrossOriginIsolationHeaders'] && 'serviceWorker' in navigator) {
|
||||
// There's a chance that installing the service worker would fix the issue
|
||||
Promise.race([
|
||||
navigator.serviceWorker.getRegistration().then((registration) => {
|
||||
if (registration != null) {
|
||||
return Promise.reject(new Error('Service worker already exists.'));
|
||||
}
|
||||
return registration;
|
||||
}).then(() => engine.installServiceWorker()),
|
||||
// For some reason, `getRegistration()` can stall
|
||||
new Promise((resolve) => {
|
||||
setTimeout(() => resolve(), 2000);
|
||||
}),
|
||||
]).catch((err) => {
|
||||
console.error('Error while registering service worker:', err);
|
||||
}).then(() => {
|
||||
window.location.reload();
|
||||
});
|
||||
} else {
|
||||
// Display the message as usual
|
||||
const missingMsg = 'Error\nThe following features required to run Godot projects on the Web are missing:\n';
|
||||
displayFailureNotice(missingMsg + missing.join('\n'));
|
||||
}
|
||||
} else {
|
||||
setStatusMode('progress');
|
||||
engine.startGame({
|
||||
'onProgress': function (current, total) {
|
||||
if (current > 0 && total > 0) {
|
||||
statusProgress.value = current;
|
||||
statusProgress.max = total;
|
||||
} else {
|
||||
statusProgress.removeAttribute('value');
|
||||
statusProgress.removeAttribute('max');
|
||||
}
|
||||
},
|
||||
}).then(() => {
|
||||
setStatusMode('hidden');
|
||||
}, displayFailureNotice);
|
||||
}
|
||||
}());
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
BIN
.build/html/index.icon.png
Normal file
BIN
.build/html/index.icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 127 KiB |
908
.build/html/index.js
Normal file
908
.build/html/index.js
Normal file
File diff suppressed because one or more lines are too long
BIN
.build/html/index.pck
Normal file
BIN
.build/html/index.pck
Normal file
Binary file not shown.
BIN
.build/html/index.png
Normal file
BIN
.build/html/index.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 21 KiB |
BIN
.build/html/index.wasm
Normal file
BIN
.build/html/index.wasm
Normal file
Binary file not shown.
BIN
.build/linux.zip
Normal file
BIN
.build/linux.zip
Normal file
Binary file not shown.
BIN
.build/linux/RomAnts.pck
Normal file
BIN
.build/linux/RomAnts.pck
Normal file
Binary file not shown.
BIN
.build/linux/RomAnts.x86_64
Normal file
BIN
.build/linux/RomAnts.x86_64
Normal file
Binary file not shown.
BIN
.build/windows.zip
Normal file
BIN
.build/windows.zip
Normal file
Binary file not shown.
BIN
.build/windows/RomAnts.exe
Normal file
BIN
.build/windows/RomAnts.exe
Normal file
Binary file not shown.
BIN
.build/windows/RomAnts.pck
Normal file
BIN
.build/windows/RomAnts.pck
Normal file
Binary file not shown.
@@ -13,6 +13,7 @@ func _on_attack_timer_timeout() -> void:
|
||||
if ant is EnemyAnt and other_ant is not EnemyAnt:
|
||||
other_ant.hit(randi_range(0, ant.damage))
|
||||
attack.emit()
|
||||
if ant is SoldierAnt: return
|
||||
for area in get_overlapping_areas():
|
||||
if area.get_parent() is Building:
|
||||
var building := area.get_parent() as Building
|
||||
|
||||
@@ -5,5 +5,5 @@ extends MeshInstance3D
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
visible = ant.capacity > 0 and \
|
||||
ant.target == PlayerCamp.instance and \
|
||||
ant.target is PlayerCamp and \
|
||||
ant.source_target.type == type
|
||||
|
||||
@@ -15,8 +15,6 @@ height = 2.88419
|
||||
axis_lock_angular_x = true
|
||||
axis_lock_angular_z = true
|
||||
script = ExtResource("1_kehry")
|
||||
damage = 4
|
||||
max_health = 15
|
||||
speed = 3.0
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
|
||||
@@ -24,7 +22,7 @@ transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 1.4
|
||||
shape = SubResource("CapsuleShape3D_bqyr6")
|
||||
|
||||
[node name="NavigationAgent3D" type="NavigationAgent3D" parent="."]
|
||||
target_desired_distance = 2.0
|
||||
target_desired_distance = 3.0
|
||||
avoidance_enabled = true
|
||||
debug_path_custom_color = Color(0.3, 0.381667, 1, 1)
|
||||
|
||||
@@ -38,9 +36,9 @@ texture = ExtResource("2_hdgws")
|
||||
|
||||
[node name="Skeleton3D" parent="enemy/EnemyAnt" index="0"]
|
||||
bones/0/rotation = Quaternion(-0.151731, -0.023891, -0.015694, 0.988008)
|
||||
bones/1/rotation = Quaternion(-0.448048, 0.00344809, -0.000394401, 0.894003)
|
||||
bones/1/rotation = Quaternion(-0.453618, 0.00738223, -0.000844401, 0.891166)
|
||||
bones/2/rotation = Quaternion(0.597894, 0.051707, -0.697194, 0.392135)
|
||||
bones/3/rotation = Quaternion(-0.268977, 0.0602213, -0.581107, 0.765729)
|
||||
bones/3/rotation = Quaternion(-0.261701, 0.0566905, -0.585419, 0.765234)
|
||||
bones/3/scale = Vector3(1, 1, 1)
|
||||
bones/4/rotation = Quaternion(-0.185361, 0.0767715, -0.304188, 0.931245)
|
||||
bones/4/scale = Vector3(1, 1, 1)
|
||||
@@ -55,10 +53,10 @@ bones/8/rotation = Quaternion(0.731112, 0.216438, -0.270013, 0.587982)
|
||||
bones/9/rotation = Quaternion(-0.147272, -0.690287, -0.291994, 0.64541)
|
||||
bones/10/rotation = Quaternion(0.035527, -0.0722718, -0.344413, 0.935358)
|
||||
bones/10/scale = Vector3(1, 1, 1)
|
||||
bones/11/rotation = Quaternion(0.582122, -0.384409, 0.688139, 0.199572)
|
||||
bones/11/rotation = Quaternion(0.58198, -0.38065, 0.688782, 0.204903)
|
||||
bones/12/rotation = Quaternion(-0.275331, -0.0633099, 0.577289, 0.766108)
|
||||
bones/12/scale = Vector3(1, 1, 1)
|
||||
bones/13/rotation = Quaternion(0.0216325, 0.352033, 0.113455, 0.928834)
|
||||
bones/13/rotation = Quaternion(0.0127256, 0.347415, 0.116465, 0.930364)
|
||||
bones/13/scale = Vector3(1, 1, 1)
|
||||
bones/14/position = Vector3(-0.131012, 0.4206, 0.0209323)
|
||||
bones/14/rotation = Quaternion(0.311801, -0.156763, 0.515707, 0.782465)
|
||||
@@ -71,7 +69,7 @@ bones/17/rotation = Quaternion(0.742166, -0.221688, 0.264848, 0.574369)
|
||||
bones/18/rotation = Quaternion(-0.156224, 0.731565, 0.301322, 0.59128)
|
||||
bones/19/rotation = Quaternion(0.035527, 0.0722718, 0.344413, 0.935358)
|
||||
bones/19/scale = Vector3(1, 1, 1)
|
||||
bones/20/rotation = Quaternion(0.000485378, 0.711083, 0.703105, -0.00183471)
|
||||
bones/20/rotation = Quaternion(0.00103909, 0.715589, 0.69851, -0.00392773)
|
||||
|
||||
[node name="AnimationTree" type="AnimationTree" parent="enemy"]
|
||||
tree_root = ExtResource("4_px4kn")
|
||||
|
||||
@@ -76,9 +76,9 @@ stretch_mode = 4
|
||||
|
||||
[node name="Skeleton3D" parent="soldier/SoldierAnt" index="0"]
|
||||
bones/0/rotation = Quaternion(-0.151731, -0.023891, -0.015694, 0.988008)
|
||||
bones/1/rotation = Quaternion(-0.454449, 0.00797132, -0.000911783, 0.890736)
|
||||
bones/1/rotation = Quaternion(-0.513811, 0.0510532, -0.00583962, 0.856363)
|
||||
bones/2/rotation = Quaternion(0.597894, 0.051707, -0.697194, 0.392135)
|
||||
bones/3/rotation = Quaternion(-0.26061, 0.0561613, -0.58606, 0.765155)
|
||||
bones/3/rotation = Quaternion(-0.179347, 0.0171244, -0.630019, 0.755392)
|
||||
bones/3/scale = Vector3(1, 1, 1)
|
||||
bones/4/rotation = Quaternion(-0.185361, 0.0767715, -0.304188, 0.931245)
|
||||
bones/4/scale = Vector3(1, 1, 1)
|
||||
@@ -93,10 +93,10 @@ bones/8/rotation = Quaternion(0.731112, 0.216438, -0.270013, 0.587982)
|
||||
bones/9/rotation = Quaternion(-0.147272, -0.690287, -0.291994, 0.64541)
|
||||
bones/10/rotation = Quaternion(0.035527, -0.0722718, -0.344413, 0.935358)
|
||||
bones/10/scale = Vector3(1, 1, 1)
|
||||
bones/11/rotation = Quaternion(0.581957, -0.380086, 0.688875, 0.2057)
|
||||
bones/11/rotation = Quaternion(0.578724, -0.337804, 0.693925, 0.263507)
|
||||
bones/12/rotation = Quaternion(-0.275331, -0.0633099, 0.577289, 0.766108)
|
||||
bones/12/scale = Vector3(1, 1, 1)
|
||||
bones/13/rotation = Quaternion(0.0113916, 0.34672, 0.116915, 0.930584)
|
||||
bones/13/rotation = Quaternion(-0.0864303, 0.293427, 0.149054, 0.940326)
|
||||
bones/13/scale = Vector3(1, 1, 1)
|
||||
bones/14/position = Vector3(-0.131012, 0.4206, 0.0209323)
|
||||
bones/14/rotation = Quaternion(0.311801, -0.156763, 0.515707, 0.782465)
|
||||
@@ -109,7 +109,7 @@ bones/17/rotation = Quaternion(0.742166, -0.221688, 0.264848, 0.574369)
|
||||
bones/18/rotation = Quaternion(-0.156224, 0.731565, 0.301322, 0.59128)
|
||||
bones/19/rotation = Quaternion(0.035527, 0.0722718, 0.344413, 0.935358)
|
||||
bones/19/scale = Vector3(1, 1, 1)
|
||||
bones/20/rotation = Quaternion(0.001122, 0.716261, 0.697819, -0.00424113)
|
||||
bones/20/rotation = Quaternion(0.00718503, 0.763404, 0.64531, -0.0271591)
|
||||
|
||||
[node name="AnimationTree" type="AnimationTree" parent="soldier"]
|
||||
tree_root = ExtResource("5_c6ikb")
|
||||
|
||||
@@ -43,3 +43,23 @@ func _on_target_reached() -> void:
|
||||
capacity = 0
|
||||
target = source_target
|
||||
go_to(target.global_position)
|
||||
|
||||
|
||||
func _on_area_3d_area_entered(area: Area3D) -> void:
|
||||
if area.get_parent() is CollectableResource:
|
||||
var resource := area.get_parent() as CollectableResource
|
||||
capacity = resource.collect(5)
|
||||
target = PlayerCamp.instance
|
||||
go_to(target.global_position)
|
||||
elif area.get_parent() is PlayerCamp:
|
||||
var camp := area.get_parent() as PlayerCamp
|
||||
match source_target.type:
|
||||
CollectableResource.ResourceType.FOOD:
|
||||
camp.food_capacity += capacity
|
||||
CollectableResource.ResourceType.WOOD:
|
||||
camp.wood_capacity += capacity
|
||||
CollectableResource.ResourceType.STONE:
|
||||
camp.stone_capacity += capacity
|
||||
capacity = 0
|
||||
target = source_target
|
||||
go_to(target.global_position)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=23 format=4 uid="uid://cbc61u4p4mn05"]
|
||||
[gd_scene load_steps=24 format=4 uid="uid://cbc61u4p4mn05"]
|
||||
|
||||
[ext_resource type="Script" path="res://entities/ants/worker_ant.gd" id="1_hmrg3"]
|
||||
[ext_resource type="PackedScene" uid="uid://v2kcdfr5npqb" path="res://assets/fbx/base_ant.fbx" id="2_b8awe"]
|
||||
@@ -123,6 +123,9 @@ fill_to = Vector2(1, 1)
|
||||
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_uj2kw"]
|
||||
texture = SubResource("GradientTexture2D_upbt3")
|
||||
|
||||
[sub_resource type="BoxShape3D" id="BoxShape3D_6s5hc"]
|
||||
size = Vector3(3, 3, 3)
|
||||
|
||||
[node name="WorkerAnt" type="CharacterBody3D"]
|
||||
axis_lock_angular_x = true
|
||||
axis_lock_angular_z = true
|
||||
@@ -136,7 +139,7 @@ shape = SubResource("CapsuleShape3D_bqyr6")
|
||||
|
||||
[node name="Skeleton3D" parent="base_ant/BaseAnt" index="0"]
|
||||
bones/0/rotation = Quaternion(9.9051e-05, -8.31996e-29, 6.6946e-17, 1)
|
||||
bones/1/rotation = Quaternion(0.0811275, 0.000963642, -0.206745, 0.975025)
|
||||
bones/1/rotation = Quaternion(0.0536049, -3.59708e-18, -7.87621e-17, 0.998562)
|
||||
bones/3/rotation = Quaternion(0.541099, 0.16567, -0.351117, 0.745978)
|
||||
bones/4/rotation = Quaternion(-0.275331, 0.0633099, -0.577289, 0.766108)
|
||||
bones/7/rotation = Quaternion(0.674429, 0.240017, -0.247256, 0.652994)
|
||||
@@ -152,7 +155,7 @@ bones/24/rotation = Quaternion(0.0469251, 0.0954517, 0.66037, 0.74337)
|
||||
bones/27/rotation = Quaternion(0, 0, 1, 0)
|
||||
|
||||
[node name="BoneAttachment3D" type="BoneAttachment3D" parent="base_ant/BaseAnt/Skeleton3D" index="0"]
|
||||
transform = Transform3D(0.914511, 0.40332, -0.0316663, -0.403001, 0.901318, -0.158797, -0.0355045, 0.157983, 0.986803, 1.16994e-19, 0.00431615, 0.00552689)
|
||||
transform = Transform3D(1, 2.3791e-17, -1.2808e-18, -2.37911e-17, 0.994232, -0.107253, -1.27823e-18, 0.107253, 0.994232, 1.16994e-19, 0.00431615, 0.00552689)
|
||||
bone_name = "Head"
|
||||
bone_idx = 1
|
||||
|
||||
@@ -189,7 +192,7 @@ anim_player = NodePath("../AnimationPlayer")
|
||||
parameters/blend_position = 0.0
|
||||
|
||||
[node name="NavigationAgent3D" type="NavigationAgent3D" parent="."]
|
||||
target_desired_distance = 2.0
|
||||
target_desired_distance = 3.0
|
||||
avoidance_enabled = true
|
||||
debug_path_custom_color = Color(0.3, 0.381667, 1, 1)
|
||||
|
||||
@@ -224,9 +227,17 @@ texture = ExtResource("6_l4m2r")
|
||||
|
||||
[node name="Node3D" parent="." instance=ExtResource("8_th62q")]
|
||||
|
||||
[node name="Area3D" type="Area3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.672495, -2.70862)
|
||||
monitorable = false
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="Area3D"]
|
||||
shape = SubResource("BoxShape3D_6s5hc")
|
||||
|
||||
[connection signal="mouse_entered" from="." to="base_ant/BaseAnt/Skeleton3D/Head2" method="_on_mouse_entered"]
|
||||
[connection signal="mouse_exited" from="." to="base_ant/BaseAnt/Skeleton3D/Head2" method="_on_mouse_exited"]
|
||||
[connection signal="navigation_finished" from="NavigationAgent3D" to="." method="_on_target_reached"]
|
||||
[connection signal="velocity_computed" from="NavigationAgent3D" to="." method="_on_velocity_computed"]
|
||||
[connection signal="area_entered" from="Area3D" to="." method="_on_area_3d_area_entered"]
|
||||
|
||||
[editable path="base_ant"]
|
||||
|
||||
@@ -3,8 +3,8 @@ class_name PlayerCamp extends Building
|
||||
static var instance:PlayerCamp
|
||||
|
||||
var food_capacity:=100
|
||||
var wood_capacity:=100
|
||||
var stone_capacity:=100
|
||||
var wood_capacity:=40
|
||||
var stone_capacity:=40
|
||||
|
||||
var active_indicator:Indicator
|
||||
|
||||
@@ -24,7 +24,7 @@ func on_interact(object:CollisionObject3D, point:Vector3)->void:
|
||||
buy_ant(40, point, soldier_scene)
|
||||
if active_indicator.type == Indicator.IndicatorType.BUILDING_BALISTA:
|
||||
var ballista_scene := load("res://entities/buildings/ballista.tscn") as PackedScene
|
||||
buy_building(40, 40, point, ballista_scene)
|
||||
buy_building(20, 20, point, ballista_scene)
|
||||
|
||||
func _on_worker_pressed() -> void:
|
||||
if active_indicator != null: active_indicator.queue_free()
|
||||
|
||||
@@ -54,7 +54,7 @@ script/source = "extends Panel
|
||||
func _process(delta: float) -> void:
|
||||
$HBoxContainer/Worker/Worker.disabled = PlayerCamp.instance.food_capacity < 20
|
||||
$HBoxContainer/Soldier/Soldier.disabled = PlayerCamp.instance.food_capacity < 40
|
||||
$HBoxContainer/Balista/AspectRatioContainer/balista.disabled = PlayerCamp.instance.stone_capacity < 40 or PlayerCamp.instance.wood_capacity < 40
|
||||
$HBoxContainer/Balista/AspectRatioContainer/balista.disabled = PlayerCamp.instance.stone_capacity < 20 or PlayerCamp.instance.wood_capacity < 20
|
||||
"
|
||||
|
||||
[sub_resource type="StyleBoxTexture" id="StyleBoxTexture_hx5fy"]
|
||||
@@ -261,7 +261,7 @@ expand_mode = 2
|
||||
|
||||
[node name="Label" type="Label" parent="RecruitOptions/HBoxContainer/Balista/HBoxContainer"]
|
||||
layout_mode = 2
|
||||
text = "40"
|
||||
text = "20"
|
||||
horizontal_alignment = 1
|
||||
|
||||
[node name="Healthbar" parent="." instance=ExtResource("13_0oymu")]
|
||||
|
||||
@@ -16,4 +16,4 @@ func collect(amount:int)->int:
|
||||
|
||||
func _on_tick() -> void:
|
||||
if capacity < 100: return
|
||||
capacity += 1
|
||||
capacity += 10
|
||||
|
||||
@@ -34,6 +34,13 @@ layers = 2
|
||||
billboard = 1
|
||||
texture = ExtResource("4_w3ttc")
|
||||
|
||||
[node name="Area3D" type="Area3D" parent="."]
|
||||
monitoring = false
|
||||
|
||||
[node name="CollisionShape3D2" type="CollisionShape3D" parent="Area3D"]
|
||||
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0.442429, 0)
|
||||
shape = SubResource("SphereShape3D_g8vog")
|
||||
|
||||
[connection signal="mouse_entered" from="." to="food/Food" method="_on_mouse_entered"]
|
||||
[connection signal="mouse_exited" from="." to="food/Food" method="_on_mouse_exited"]
|
||||
[connection signal="timeout" from="Timer" to="." method="_on_tick"]
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=5 format=3 uid="uid://kslywe6neejo"]
|
||||
[gd_scene load_steps=6 format=3 uid="uid://kslywe6neejo"]
|
||||
|
||||
[ext_resource type="Script" path="res://entities/resources/collectable_resource.gd" id="1_ybx4f"]
|
||||
[ext_resource type="PackedScene" uid="uid://rheyik3n6qia" path="res://assets/fbx/rock.fbx" id="2_uwrg3"]
|
||||
@@ -7,6 +7,9 @@
|
||||
[sub_resource type="SphereShape3D" id="SphereShape3D_2ifhi"]
|
||||
radius = 1.9217
|
||||
|
||||
[sub_resource type="SphereShape3D" id="SphereShape3D_gjw2c"]
|
||||
radius = 2.0
|
||||
|
||||
[node name="StoneResource" type="StaticBody3D" groups=["NavmeshTargets"]]
|
||||
script = ExtResource("1_ybx4f")
|
||||
type = 1
|
||||
@@ -27,6 +30,13 @@ layers = 2
|
||||
billboard = 1
|
||||
texture = ExtResource("3_uq1d7")
|
||||
|
||||
[node name="Area3D" type="Area3D" parent="."]
|
||||
monitoring = false
|
||||
|
||||
[node name="CollisionShape3D2" type="CollisionShape3D" parent="Area3D"]
|
||||
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0.442429, 0)
|
||||
shape = SubResource("SphereShape3D_gjw2c")
|
||||
|
||||
[connection signal="timeout" from="Timer" to="." method="_on_tick"]
|
||||
|
||||
[editable path="rock"]
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
[gd_scene load_steps=6 format=3 uid="uid://kh5xmgawk26n"]
|
||||
[gd_scene load_steps=7 format=3 uid="uid://kh5xmgawk26n"]
|
||||
|
||||
[ext_resource type="Script" path="res://entities/resources/collectable_resource.gd" id="1_khlta"]
|
||||
[ext_resource type="PackedScene" uid="uid://87uikru2r8pc" path="res://assets/fbx/plant.fbx" id="2_u6krj"]
|
||||
@@ -10,6 +10,9 @@ radius = 2.49866
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_do68j"]
|
||||
albedo_color = Color(0.53, 0.366053, 0.1908, 1)
|
||||
|
||||
[sub_resource type="SphereShape3D" id="SphereShape3D_gc3ak"]
|
||||
radius = 2.0
|
||||
|
||||
[node name="WoodResource" type="StaticBody3D" groups=["NavmeshTargets"]]
|
||||
script = ExtResource("1_khlta")
|
||||
type = 2
|
||||
@@ -34,6 +37,13 @@ layers = 2
|
||||
billboard = 1
|
||||
texture = ExtResource("3_i5i26")
|
||||
|
||||
[node name="Area3D" type="Area3D" parent="."]
|
||||
monitoring = false
|
||||
|
||||
[node name="CollisionShape3D2" type="CollisionShape3D" parent="Area3D"]
|
||||
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0.442429, 0)
|
||||
shape = SubResource("SphereShape3D_gc3ak")
|
||||
|
||||
[connection signal="timeout" from="Timer" to="." method="_on_tick"]
|
||||
|
||||
[editable path="plant"]
|
||||
|
||||
Reference in New Issue
Block a user