Files
kicking-high/proto3/godot/autoloads/rpg.gd
2020-04-13 12:45:25 +03:00

287 lines
8.2 KiB
GDScript

extends Node
func _ready():
pass # Replace with function body.
var stats = {
"health": {"rise": 0.0005, "base": 100, "random": 1000, "bonus": 10000},
"stamina": {"rise": 0.0012, "base": 100, "random": 1000, "bonus": 10000},
"strength": {"rise": 0.0, "base": 100, "random": 1000, "bonus": 10000},
"agility": {"rise": 0.0, "base": 100, "random": 1000, "bonus": 10000},
"intelligence": {"rise": 0.0, "base": 100, "random": 1000, "bonus": 10000},
}
var needs = {
"hunger": {
"stat": "max_health",
"mul": 0.001
},
"thirst": {
"stat": "max_health",
"mul": 0.001
},
"lust": {
"stat": "strength",
"mul": 0.002
}
}
func create_stats(obj):
assert(obj.is_in_group("characters"))
for k in stats.keys():
var kmax = "max_" + k
var val = stats[k].base + randi() % stats[k].random
obj.set_meta(k, val)
obj.set_meta(kmax, val)
obj.set_meta("submission", 0)
obj.set_meta("agression", 0)
obj.set_meta("panic", 0)
obj.set_meta("xp", 0)
obj.set_meta("next_xp", 100)
obj.set_meta("level", 1)
for k in needs.keys():
obj.set_meta(k, 0.0)
if obj.is_in_group("guard"):
var st = obj.get_meta("max_strength")
if st < 1000.0:
obj.set_meta("strength", st)
obj.set_meta("max_strength", st)
var sm = obj.get_meta("max_stamina")
if sm < 2000.0:
obj.set_meta("stamina", sm)
obj.set_meta("max_stamina", sm)
if obj.is_in_group("maid"):
var subm = obj.get_meta("submission")
if subm < 1000.0:
obj.set_meta("submission", subm)
var save_stats = [
"health",
"stamina",
"strength",
"agility",
"intelligence",
"submission",
"xp",
"next_xp",
"level"]
func update_needs(obj):
for k in needs.keys():
var s = needs[k].stat
var m = needs[k].mul
var nval = obj.get_meta(k)
nval += obj.get_meta(s) * m * get_process_delta_time()
obj.set_meta(k, nval)
func update_stats(obj):
assert(obj.is_in_group("characters"))
if obj.get_meta("grabbing"):
return
if obj.get_meta("smart_object"):
return
for k in stats.keys():
var val = obj.get_meta(k)
var max_val = obj.get_meta("max_" + k)
var incr = stats[k].rise * max_val * get_process_delta_time()
# print("incr: ", obj.name, " ", incr)
if val < 0.1 * max_val:
val += 0.3 * incr
else:
val += incr
# print("stat: ", k, " incr: ", incr, " val: ", val)
obj.set_meta(k, clamp(val, 0, max_val))
var sub = get_submission(obj)
var aggr = get_agression(obj)
var pnc = get_panic(obj)
var pnc_inc = 0.0
var aggr_inc = 0.0
if combat.enemy_nearby(obj, 4.0):
pnc_inc += 1.0 / (1.0 + sub * 2.0)
aggr_inc += get_strength(obj) / (1.0 + pnc + sub)
if obj.is_in_group("maid"):
pnc_inc *= 0.1
elif obj.is_in_group("guard"):
pnc_inc = 0.0
else:
pnc_inc -= 0.5 * (get_strength(obj) + (1.0 + sub))
if obj.is_in_group("maid"):
pnc_inc *= 100.0
if obj.is_in_group("guard"):
pnc_inc *= 200.0
if obj.is_in_group("maid"):
pnc_inc *= 0.1
aggr += aggr_inc * get_process_delta_time()
pnc += pnc_inc * get_process_delta_time()
aggr = clamp(aggr, 0.0, 100000.0)
pnc = clamp(pnc, 0.0, 100000.0)
obj.set_meta("panic", pnc)
obj.set_meta("agression", aggr)
func level_up(obj):
assert(obj.is_in_group("characters"))
var level = obj.get_meta("level")
var next_xp = obj.get_meta("next_xp")
for k in stats.keys():
var kmax = "max_" + k
if level < 100:
var val = obj.get_meta(kmax) + stats[k].bonus / (100 - level)
obj.set_meta(kmax, val)
obj.set_meta(k, val)
else:
var val = obj.get_meta(kmax) + stats[k].bonus
obj.set_meta(kmax, val)
obj.set_meta(k, val)
if level < 100:
next_xp += int(clamp(level * next_xp / 5, 50, next_xp * 2))
else:
next_xp += int(next_xp * 1.5)
level += 1
dump_stats(obj)
func update_xp(obj, xp):
assert(obj.is_in_group("characters"))
var cur_xp = obj.get_meta("xp")
var next_xp = obj.get_meta("next_xp")
cur_xp += xp
if cur_xp >= next_xp:
level_up(obj)
cur_xp -= next_xp
obj.set_meta("xp", cur_xp)
func can_attack(obj):
assert(obj.is_in_group("characters"))
if obj.get_meta("grabbed"):
return false
if obj.get_meta("smart_object"):
return false
if obj.get_meta("health") <= 0:
return false
if obj.get_meta("stamina") <= 0:
return false
return true
func melee_attack(attacker, enemy):
assert(attacker.is_in_group("characters"))
assert(enemy.is_in_group("characters"))
if !can_attack(attacker):
return
var attack_base = int(attacker.get_meta("strength"))
var attack_bonus = int(attacker.get_meta("agility"))
var attack_val = attack_base + randi() % (1 + attack_bonus)
var defence = enemy.get_meta("agility") + randi() % (1 + int(enemy.get_meta("strength")))
var damage = int(clamp(attack_val - defence, 0, attack_val))
var enemy_health = int(enemy.get_meta("health"))
enemy_health = int(clamp(enemy_health - damage, 0, enemy_health))
enemy.set_meta("health", enemy_health)
var stamina = attacker.get_meta("stamina")
stamina -= damage / (2 + attacker.get_meta("agility"))
attacker.set_meta("stamina", stamina)
if enemy_health == 0:
update_xp(attacker, int(enemy.get_meta("max_health") * 0.1))
else:
update_xp(attacker, int(damage * 0.1))
# dump_stats(enemy)
func projectile_attack(pj, enemy):
var damage = pj.get_mass() * pj.get_linear_velocity().length() * 3.0
# print("DAMAGE: ", damage)
if pj.has_meta("owner"):
var attacker = pj.get_meta("owner")
update_xp(attacker, int(10 + damage))
var enemy_health = int(enemy.get_meta("health"))
enemy_health = int(clamp(enemy_health - damage, 0, enemy_health))
enemy.set_meta("health", enemy_health)
# dump_stats(enemy)
func submission_check(attacker, enemy):
assert(attacker.is_in_group("characters"))
assert(enemy.is_in_group("characters"))
var astrength = attacker.get_meta("strength")
var estrength = enemy.get_meta("strength")
var esub = enemy.get_meta("submission")
if astrength > estrength + esub:
return true
return false
func strength_check(attacker, enemy):
assert(attacker.is_in_group("characters"))
assert(enemy.is_in_group("characters"))
var astrength = attacker.get_meta("strength")
var estrength = attacker.get_meta("strength")
if astrength * 0.5 > estrength:
return true
return false
func dump_stats(obj):
assert(obj.is_in_group("characters"))
# print(stats.keys())
for k in stats.keys():
assert(obj.get_meta(k))
print(k + ": ", obj.get_meta(k))
print("submission: ", obj.get_meta("submission"))
print("xp: ", obj.get_meta("xp"))
print("next_xp: ", obj.get_meta("next_xp"))
print("level: ", obj.get_meta("level"))
func damage_stamina(obj, val):
assert(obj.is_in_group("characters"))
var stamina = obj.get_meta("stamina")
var max_stamina = obj.get_meta("max_stamina")
stamina -= val
obj.set_meta("stamina", clamp(stamina, 0.0, max_stamina))
func get_health(obj):
assert(obj.is_in_group("characters"))
var health = obj.get_meta("health")
return health
func get_stamina(obj):
assert(obj.is_in_group("characters"))
var stamina = obj.get_meta("stamina")
return stamina
func get_strength(obj):
assert(obj.is_in_group("characters"))
var strength = obj.get_meta("strength")
return strength
func get_agression(obj):
assert(obj.is_in_group("characters"))
var agression = obj.get_meta("agression")
return agression
func get_submission(obj):
assert(obj.is_in_group("characters"))
var submission = obj.get_meta("submission")
return submission
func get_panic(obj):
assert(obj.is_in_group("characters"))
var panic = obj.get_meta("panic")
return panic
func get_lust(obj):
assert(obj.is_in_group("characters"))
var lust = obj.get_meta("lust")
return lust
func add_panic(obj, val):
assert(obj.is_in_group("characters"))
var panic = get_panic(obj)
panic += val
obj.set_meta("panic", panic)
func add_agression(obj, val):
assert(obj.is_in_group("characters"))
var agression = get_agression(obj)
agression += val
obj.set_meta("panic", agression)
func is_enemy(ch1, ch2):
var versus = [
["player", "player", false],
["player", "guard", false],
["player", "maid", false],
["player", "captive", true],
["guard", "guard", false],
["guard", "player", false],
["guard", "maid", false],
["guard", "captive", true],
["maid", "maid", false],
["maid", "player", false],
["maid", "guard", true],
["maid", "captive", true],
["captive", "player", true],
["captive", "guard", true],
["captive", "maid", true],
["captive", "captive", false]
]
for e in versus:
if ch1.is_in_group(e[0]) && ch2.is_in_group(e[1]):
return e[2]
return false