Uses for every material (clay jar, bedroll, pelt rug, fang necklace, bear cloak, pemmican, bait), Q to drop, K/M bag rows on 1-8, help pages; protocol 14

This commit is contained in:
Paul Bailey
2026-11-06 11:49:42 +00:00
parent 5778d61763
commit 4b2e687188
29 changed files with 1457 additions and 40 deletions

View File

@@ -31,6 +31,9 @@ func _ready() -> void:
_bind("inventory", [KEY_TAB, KEY_I])
_bind("rotate_piece", [KEY_R])
_bind("dismantle", [KEY_X])
_bind("drop", [KEY_Q]) # (shift+Q drops just one)
_bind("row_up", [KEY_K]) # the 1-8 keys pick from the bag row above...
_bind("row_down", [KEY_M]) # ...or below
for i in range(8):
_bind("hotbar_%d" % (i + 1), [KEY_1 + i])
_bind_mouse("attack", MOUSE_BUTTON_LEFT)
@@ -736,8 +739,53 @@ static func harvest_sound(tool_kind: String, felled: bool) -> String:
## A piece going down: wood, stone, or something soft.
static func place_sound(id: String) -> String:
if id.contains("stone") or id in ["campfire", "forge", "hearth", "stonecutter"]:
if id.contains("stone") or id.contains("jar") or id in ["campfire", "forge", "hearth", "stonecutter"]:
return "place_stone"
if id.contains("rug") or id.contains("bed") or id == "smoking_rack":
return "place_soft"
return "place_wood"
# --- charms and bait ------------------------------------------------------------------
## A charm carried anywhere in the bag (the fang necklace: {"against": "wolf",
## "damage": 0.7}) takes the edge off hits from what it's against. `by` is the
## hit's "a wolf" / "a alpha wolf" / "a spirit wolf" (survival.damage).
static func charm_mult(inv: Inventory, by: String) -> float:
var m := 1.0
if by.is_empty():
return m
for s in inv.slots:
if s == null:
continue
var c: Dictionary = ItemDB.get_item(String(s.id)).get("charm", {})
if not c.is_empty() and by.to_lower().contains(String(c.get("against", "?"))):
m = minf(m, float(c.get("damage", 1.0)))
return m
const BAIT := "rotten_food"
const BAIT_WAIT := 0.6 ## carried while fishing: bites come this much sooner
## Drops the stack in `slot` (or `count` of it) at your feet, a little in
## front (Q drops what's in your hand). Online the server does it, for everyone.
func drop(player: Node3D, slot: int, count: int = 0) -> bool:
if _online():
return _ask("drop", [slot, count])
var s = player.inventory.get_slot(slot)
if s == null:
return false
var n: int = int(s.count) if count <= 0 else mini(count, int(s.count))
# (on a server the player is a proxy under PlayerNet, not a child of the world)
var world: Node = WorldNet.world if Net.is_server() else player.get_parent()
if world == null or not world.has_method("drop_item"):
return false
var fwd: Vector3 = -player.global_basis.z
fwd.y = 0.0
var at: Vector3 = player.global_position + fwd.normalized() * 0.9
at.y = world.terrain.sample_height(at.x, at.z) + 0.05 if world.get("terrain") != null else player.global_position.y
var extra := Inventory.extra_of(s)
if world.drop_item(String(s.id), n, Transform3D(Basis(), at), extra) == null:
return false
player.inventory.take_from(slot, n)
Sfx.at("pickup", at)
notify.emit("Dropped %d %s" % [n, ItemDB.item_name(String(s.id))])
return true

View File

@@ -65,6 +65,10 @@ static func extra_of(stack: Dictionary) -> Dictionary:
static var clock := 0.0
static var day_seconds := 1200.0
static var rot_speed := 1.0
## How many times longer food keeps in here (a clay jar: 3), and the clock at
## the last spoil() (the time since is what's slowed).
var keep_mult := 1.0
var _last_clock := -1.0
const ROTTEN := "rotten_food"
static func _db() -> Node:
@@ -110,6 +114,15 @@ func spoil() -> int:
return 0
var rotted := 0
var touched := false
# A clay jar (keep_mult 3): food in it ages at a third of the rate, so its
# "rot" stamp moves back by two thirds of the time that's passed.
if keep_mult > 1.0:
if _last_clock >= 0.0 and clock > _last_clock:
var later := (clock - _last_clock) * (1.0 - 1.0 / keep_mult)
for s in slots:
if s != null and s.has("rot") and float(s.rot) > _last_clock:
s.rot = float(s.rot) + later
_last_clock = clock
for i in range(slots.size()):
var s = slots[i]
if s == null or keeps_days(String(s.id)) <= 0.0: