mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-24 04:27:35 +01:00
Nano-Mob Hunter GO! Battle System
Two new terminals have been added just outside the holodeck, capable to projecting holograms of your Nano-Mobs for you to pit in battle against your rival (or your other Nano-Mobs). Battling is turn-based, with each side choosing to either attack, recall, or surrender (if they don't have a mob on the field). Reducing your rival's Nano-Mob to 0 health will down it, earning your mob valuable battle experience and even increasing it's level! Surrendering ends the battle, but does not grant experience as the battle was not completed. Additionally, Medical has provided a brand new Nano-Mob Hunter GO! Restoration Terminal for use in their lobby area. Simply swipe any Nano-Mob card through and it will be restored to full health instantly!
This commit is contained in:
@@ -0,0 +1,268 @@
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal
|
||||
name = "Nano-Mob Hunter GO! Battle Terminal"
|
||||
desc = "Insert a mob card to partake in life-like Nano-Mob Battle Action!"
|
||||
icon_state = "mob_battle_empty"
|
||||
icon_screen = null
|
||||
icon_keyboard = null
|
||||
density = 0
|
||||
anchored = 1
|
||||
var/obj/item/weapon/nanomob_card/card
|
||||
var/datum/mob_hunt/mob_info
|
||||
var/obj/effect/nanomob/battle/avatar
|
||||
var/ready = 0
|
||||
var/team = "Grey"
|
||||
var/avatar_x_offset = 4
|
||||
var/avatar_y_offset = 0
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/red
|
||||
pixel_y = 24
|
||||
dir = SOUTH
|
||||
team = "Red"
|
||||
avatar_y_offset = -1
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/blue
|
||||
pixel_y = -24
|
||||
dir = NORTH
|
||||
team = "Blue"
|
||||
avatar_y_offset = 1
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/red/New()
|
||||
..()
|
||||
if(mob_hunt_server && !mob_hunt_server.red_terminal)
|
||||
mob_hunt_server.red_terminal = src
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/blue/New()
|
||||
..()
|
||||
if(mob_hunt_server && !mob_hunt_server.blue_terminal)
|
||||
mob_hunt_server.blue_terminal = src
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/update_icon()
|
||||
if(card)
|
||||
icon_state = "mob_battle_loaded"
|
||||
else
|
||||
icon_state = "mob_battle_empty"
|
||||
..()
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/Destroy()
|
||||
eject_card(1)
|
||||
if(mob_hunt_server)
|
||||
if(mob_hunt_server.battle_turn)
|
||||
mob_hunt_server.battle_turn = null
|
||||
if(mob_hunt_server.red_terminal == src)
|
||||
mob_hunt_server.red_terminal = null
|
||||
if(mob_hunt_server.blue_terminal == src)
|
||||
mob_hunt_server.blue_terminal = null
|
||||
if(avatar)
|
||||
qdel(avatar)
|
||||
..()
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/attackby(obj/item/O, mob/user)
|
||||
if(istype(O, /obj/item/weapon/nanomob_card))
|
||||
insert_card(O, user)
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/proc/insert_card(obj/item/weapon/nanomob_card/new_card, mob/user)
|
||||
if(!new_card)
|
||||
return
|
||||
if(card)
|
||||
to_chat(user, "<span class='warning'>The card slot is currently filled.</span>")
|
||||
return
|
||||
if(!new_card.mob_data)
|
||||
to_chat(user, "<span class='danger'>This is a blank mob card.</span>")
|
||||
return
|
||||
if(new_card.mob_data && !new_card.mob_data.cur_health)
|
||||
to_chat(user, "<span class='warning'>This mob is incapacitated! Heal it before attempting to use it in battle!</span>")
|
||||
return
|
||||
user.unEquip(new_card)
|
||||
new_card.forceMove(src)
|
||||
card = new_card
|
||||
mob_info = card.mob_data
|
||||
update_icon()
|
||||
update_avatar()
|
||||
updateUsrDialog()
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/proc/eject_card(override = 0)
|
||||
if(!override)
|
||||
if(ready && mob_hunt_server.battle_turn != team)
|
||||
audible_message("You can't recall on your rival's turn!", null, 2)
|
||||
return
|
||||
card.mob_data = mob_info
|
||||
mob_info = null
|
||||
card.forceMove(get_turf(src))
|
||||
card = null
|
||||
update_avatar()
|
||||
update_icon()
|
||||
updateUsrDialog()
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/proc/update_avatar()
|
||||
//if we don't have avatars yet, spawn them
|
||||
if(!avatar)
|
||||
avatar = new(locate((x + avatar_x_offset), (y + avatar_y_offset), z))
|
||||
//update avatar info from card
|
||||
if(mob_info)
|
||||
avatar.mob_info = mob_info
|
||||
else
|
||||
avatar.mob_info = null
|
||||
//tell the avatar to update themself with the new info
|
||||
avatar.update_self()
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/attack_hand(mob/user)
|
||||
add_fingerprint(user)
|
||||
interact(user)
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/attack_ai(mob/user)
|
||||
to_chat(user, "<span class='warning'>You cannot interface with this portion of the simulation.</span>")
|
||||
return
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/interact(mob/user)
|
||||
var/dat = ""
|
||||
dat += "<table border='1' style='width:75%'>"
|
||||
dat += "<tr>"
|
||||
dat += "<td>"
|
||||
dat += "[team] PLAYER"
|
||||
dat += "</td>"
|
||||
dat += "</tr>"
|
||||
dat += "<tr>"
|
||||
dat += "<td>"
|
||||
if(!card)
|
||||
dat += "<h1>No Nano-Mob card loaded.</h1>"
|
||||
dat += "</td>"
|
||||
dat += "</tr>"
|
||||
if(ready && mob_hunt_server.battle_turn) //offer the surrender option if they are in a battle (ready), but don't have a card loaded
|
||||
dat += "<tr>"
|
||||
dat += "<td><a href='?src=\ref[src];surrender=1'>Surrender!</a></td>"
|
||||
dat += "</tr>"
|
||||
else
|
||||
dat += "<table>"
|
||||
dat += "<tr>"
|
||||
dat += "<td>"
|
||||
dat += "<h1>[mob_info.mob_name]</h1>"
|
||||
dat += "</td>"
|
||||
if(mob_info.nickname)
|
||||
dat += "<td rowspan='2'>"
|
||||
else
|
||||
dat += "<td>"
|
||||
var/img_src = "[mob_info.icon_state_normal].png"
|
||||
if(mob_info.is_shiny)
|
||||
dat += "[mob_info.icon_state_shiny].png"
|
||||
dat += "<img src='[img_src]'>"
|
||||
dat += "</td>"
|
||||
dat += "</tr>"
|
||||
if(mob_info.nickname)
|
||||
dat += "<tr>"
|
||||
dat += "<td>"
|
||||
dat += "<h2>[mob_info.nickname]</h2>"
|
||||
dat += "</td>"
|
||||
dat += "</tr>"
|
||||
dat += "</table>"
|
||||
dat += "<hr>"
|
||||
dat += "Health: [mob_info.cur_health] / [mob_info.max_health]<br>"
|
||||
dat += "<table border='1'>"
|
||||
dat += "<tr>"
|
||||
if(mob_info.cur_health)
|
||||
dat += "<td><a href='?src=\ref[src];attack=1'>Attack!</a></td>"
|
||||
else
|
||||
dat += "<td>Incapacitated!</td>"
|
||||
dat += "<td><a href='?src=\ref[src];eject=1'>Recall!</a></td>"
|
||||
dat += "</tr>"
|
||||
dat += "</table>"
|
||||
dat += "</td>"
|
||||
dat += "</tr>"
|
||||
if(!ready)
|
||||
dat += "<tr>"
|
||||
dat += "<td><a href='?src=\ref[src];ready=1'>Battle!</a></td>"
|
||||
dat += "</tr>"
|
||||
if(ready && !mob_hunt_server.battle_turn)
|
||||
dat += "<tr>"
|
||||
dat += "<td><a href='?src=\ref[src];ready=2'>Cancel Battle!</a></td>"
|
||||
dat += "</tr>"
|
||||
dat += "</table>"
|
||||
|
||||
var/datum/browser/popup = new(user, "mob_battle_terminal", "Nano-Mob Hunter GO! Battle Terminal", 575, 400)
|
||||
popup.set_content(dat)
|
||||
popup.open()
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/Topic(href, href_list)
|
||||
if(href_list["attack"])
|
||||
do_attack()
|
||||
|
||||
if(href_list["eject"])
|
||||
eject_card()
|
||||
|
||||
if(href_list["surrender"])
|
||||
surrender()
|
||||
|
||||
if(href_list["ready"])
|
||||
var/option = text2num(href_list["ready"])
|
||||
if(option == 1)
|
||||
start_battle()
|
||||
else if(option == 2)
|
||||
ready = 0
|
||||
audible_message("[team] Player cancels their battle challenge.", null, 5)
|
||||
|
||||
updateUsrDialog()
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/proc/do_attack()
|
||||
if(!ready) //no attacking if you arent ready to fight (duh)
|
||||
return
|
||||
if(!mob_hunt_server || team != mob_hunt_server.battle_turn) //don't attack unless it is actually our turn
|
||||
return
|
||||
else
|
||||
var/message = "[mob_info.mob_name] attacks!"
|
||||
if(mob_info.nickname)
|
||||
message = "[mob_info.nickname] attacks!"
|
||||
audible_message(message, null, 5)
|
||||
mob_hunt_server.launch_attack(team, mob_info.get_raw_damage(), mob_info.get_attack_type())
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/proc/start_battle()
|
||||
if(ready) //don't do anything if we are still ready
|
||||
return
|
||||
if(!card) //don't do anything if there isn't a card inserted
|
||||
return
|
||||
ready = 1
|
||||
audible_message("[team] Player is ready for battle! Waiting for rival...", null, 5)
|
||||
mob_hunt_server.start_check()
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/proc/receive_attack(raw_damage, datum/mob_type/attack_type)
|
||||
var/message = mob_info.take_damage(raw_damage, attack_type)
|
||||
avatar.audible_message(message, null, 5)
|
||||
if(!mob_info.cur_health)
|
||||
mob_hunt_server.end_battle(team)
|
||||
eject_card(1) //force the card out, they were defeated
|
||||
else
|
||||
mob_hunt_server.end_turn()
|
||||
|
||||
/obj/machinery/computer/mob_battle_terminal/proc/surrender()
|
||||
audible_message("[team] Player surrenders the battle!", null, 5)
|
||||
mob_hunt_server.end_battle(team, 1)
|
||||
|
||||
//////////////////////////////
|
||||
// Mob Healing Terminal //
|
||||
// (Pokemon Center) //
|
||||
//////////////////////////////
|
||||
|
||||
/obj/machinery/computer/mob_healer_terminal
|
||||
name = "Nano-Mob Hunter GO! Restoration Terminal"
|
||||
desc = "Swipe a mob card to instantly restore it to full health!"
|
||||
icon_state = "mob_battle_loaded"
|
||||
icon_screen = null
|
||||
icon_keyboard = null
|
||||
density = 0
|
||||
anchored = 1
|
||||
dir = EAST
|
||||
|
||||
/obj/machinery/computer/mob_healer_terminal/attackby(obj/item/O, mob/user)
|
||||
if(istype(O, /obj/item/weapon/nanomob_card))
|
||||
heal_card(O, user)
|
||||
|
||||
/obj/machinery/computer/mob_healer_terminal/proc/heal_card(obj/item/weapon/nanomob_card/patient, mob/user)
|
||||
if(!patient)
|
||||
return
|
||||
if(!patient.mob_data)
|
||||
to_chat(user, "<span class='danger'>This is a blank mob card.</span>")
|
||||
return
|
||||
if(patient.mob_data && patient.mob_data.cur_health == patient.mob_data.max_health)
|
||||
to_chat(user, "<span class='warning'>This mob is already at maximum health!</span>")
|
||||
return
|
||||
patient.mob_data.cur_health = patient.mob_data.max_health
|
||||
to_chat(user, "<span class='notify'>[patient.mob_data.nickname ? patient.mob_data.nickname : patient.mob_data.mob_name] has been restored to full health!</span>")
|
||||
@@ -8,6 +8,9 @@ var/global/datum/controller/process/mob_hunt/mob_hunt_server
|
||||
var/list/connected_clients = list()
|
||||
var/server_status = 1 //1 is online, 0 is offline
|
||||
var/reset_cooldown = 0 //number of controller cycles before the manual_reboot proc can be used again (ignored if server is offline so you can always boot back up)
|
||||
var/obj/machinery/computer/mob_battle_terminal/red_terminal
|
||||
var/obj/machinery/computer/mob_battle_terminal/blue_terminal
|
||||
var/battle_turn = null
|
||||
|
||||
/datum/controller/process/mob_hunt/setup()
|
||||
name = "Nano-Mob Hunter GO Server"
|
||||
@@ -103,4 +106,59 @@ var/global/datum/controller/process/mob_hunt/mob_hunt_server
|
||||
if(trap_spawns.len > max_trap_spawns)
|
||||
var/obj/effect/nanomob/old_trap = trap_spawns[1]
|
||||
old_trap.despawn()
|
||||
return 1
|
||||
return 1
|
||||
|
||||
/datum/controller/process/mob_hunt/proc/start_check()
|
||||
if(battle_turn) //somehow we got called mid-battle, so lets just stop now
|
||||
return
|
||||
if(red_terminal && red_terminal.ready && blue_terminal && blue_terminal.ready)
|
||||
battle_turn = pick("Red", "Blue")
|
||||
red_terminal.audible_message("Battle starting!", null, 5)
|
||||
blue_terminal.audible_message("Battle starting!", null, 5)
|
||||
if(battle_turn == "Red")
|
||||
red_terminal.audible_message("Red Player's Turn!", null, 2)
|
||||
else if(battle_turn == "Blue")
|
||||
blue_terminal.audible_message("Blue Player's Turn!", null, 2)
|
||||
|
||||
/datum/controller/process/mob_hunt/proc/launch_attack(team, raw_damage, datum/mob_type/attack_type)
|
||||
if(!team || !raw_damage)
|
||||
return
|
||||
var/obj/machinery/computer/mob_battle_terminal/target = null
|
||||
if(team == "Red")
|
||||
target = blue_terminal
|
||||
else if(team == "Blue")
|
||||
target = red_terminal
|
||||
else
|
||||
return
|
||||
target.receive_attack(raw_damage, attack_type)
|
||||
|
||||
/datum/controller/process/mob_hunt/proc/end_battle(loser, surrender = 0)
|
||||
var/obj/machinery/computer/mob_battle_terminal/winner_terminal = null
|
||||
var/obj/machinery/computer/mob_battle_terminal/loser_terminal = null
|
||||
if(loser == "Red")
|
||||
loser_terminal = red_terminal
|
||||
winner_terminal = blue_terminal
|
||||
else if (loser == "Blue")
|
||||
loser_terminal = blue_terminal
|
||||
winner_terminal = red_terminal
|
||||
battle_turn = null
|
||||
winner_terminal.ready = 0
|
||||
loser_terminal.ready = 0
|
||||
if(surrender) //surrender doesn't give exp, to avoid people just farming exp without actually doing a battle
|
||||
winner_terminal.audible_message("Your rival surrendered!", null, 2)
|
||||
else
|
||||
var/progress_message = winner_terminal.mob_info.gain_exp()
|
||||
winner_terminal.audible_message("[winner_terminal.team] Player wins!", null, 5)
|
||||
winner_terminal.audible_message(progress_message, null, 2)
|
||||
|
||||
/datum/controller/process/mob_hunt/proc/end_turn()
|
||||
red_terminal.updateUsrDialog()
|
||||
blue_terminal.updateUsrDialog()
|
||||
if(!battle_turn)
|
||||
return
|
||||
if(battle_turn == "Red")
|
||||
battle_turn = "Blue"
|
||||
blue_terminal.audible_message("Blue's turn.", null, 5)
|
||||
else if(battle_turn == "Blue")
|
||||
battle_turn = "Red"
|
||||
blue_terminal.audible_message("Red's turn.", null, 5)
|
||||
|
||||
@@ -122,3 +122,41 @@
|
||||
if((A in clients_encountered) && mob_hunt_server.connected_clients[A])
|
||||
hiding_from |= mob_hunt_server.connected_clients[A]
|
||||
hide_alt_appearance("nanomob_avatar", hiding_from)
|
||||
|
||||
// BATTLE MOB AVATARS
|
||||
|
||||
/obj/effect/nanomob/battle
|
||||
name = "Nano-Mob Battle Avatar"
|
||||
desc = "A new challenger approaches!"
|
||||
invisibility = 0
|
||||
icon_state = "placeholder"
|
||||
var/obj/machinery/computer/mob_battle_terminal/my_terminal
|
||||
|
||||
/obj/effect/nanomob/battle/New(loc, datum/mob_hunt/new_info)
|
||||
if(new_info)
|
||||
mob_info = new_info
|
||||
update_self()
|
||||
|
||||
/obj/effect/nanomob/battle/update_self()
|
||||
if(!mob_info)
|
||||
name = "Nano-Mob Battle Avatar"
|
||||
desc = "A new challenger approaches"
|
||||
icon_state = "placeholder"
|
||||
else
|
||||
name = mob_info.mob_name
|
||||
desc = "A tamed [name] (level [mob_info.level]) ready for battle!"
|
||||
if(mob_info.is_shiny)
|
||||
icon_state = mob_info.icon_state_shiny
|
||||
else
|
||||
icon_state = mob_info.icon_state_normal
|
||||
|
||||
/obj/effect/nanomob/battle/attempt_capture(obj/item/device/pda/P, catch_mod = 0)
|
||||
//you can't capture battle avatars, since they belong to someone already
|
||||
return
|
||||
|
||||
//battle avatars are always visible, so we can ignore reveal and conceal calls for them
|
||||
/obj/effect/nanomob/battle/reveal()
|
||||
return
|
||||
|
||||
/obj/effect/nanomob/battle/conceal()
|
||||
return
|
||||
|
||||
@@ -27,6 +27,8 @@
|
||||
var/level = 0 //actual level of this mob (don't set this, it gets overwritten in New())
|
||||
var/min_level = 1 //minimum level of this mob (used for randomizing the actual level)
|
||||
var/max_level = 1 //maximum level of this mob (used for randomizing the actual level)
|
||||
var/exp = 0 //number of battles the mob has won towards the next level (resets to 0 on level-up)
|
||||
var/exp_to_level = 3 //number of battles the mob must win to level up (in case we want to make some mobs harder or easier to level)
|
||||
//the types of the mob will be used for battles to determine damage resistance or weakness (mob_type_datums.dm)
|
||||
var/datum/mob_type/primary_type //Make sure you set this or the mob will be unable to deal damage and will take absurd damage in battles
|
||||
var/datum/mob_type/secondary_type //Don't set if not a dual-type mob so the mob will only calculate damage based on primary type
|
||||
@@ -34,7 +36,8 @@
|
||||
var/base_health = 5 //base health of the mob for battling (effectively max health at level 0)
|
||||
var/attack_multiplier = 1 //how much additional damage per level the mob deals (level * attack_multiplier)
|
||||
var/health_multiplier = 1 //how much additional health per level the mob gets (level * health_multiplier) for calculating max health
|
||||
var/health = list("current" = 0, "max" = 0)
|
||||
var/cur_health = 0
|
||||
var/max_health = 0
|
||||
|
||||
//SPAWN PREFERENCES AND VARIABLES
|
||||
//A note on mob spawn preferences: The mob types also have preferences, which are handled prior to per-mob preferences, so ultimately you use a combined set of preferences
|
||||
@@ -61,7 +64,8 @@
|
||||
level = rand(min_level, max_level)
|
||||
if(prob(1) && prob(1))
|
||||
is_shiny = 1
|
||||
health["max"] = base_health + (level * health_multiplier)
|
||||
max_health = base_health + (level * health_multiplier)
|
||||
cur_health = max_health
|
||||
if(primary_type)
|
||||
primary_type = new primary_type()
|
||||
if(secondary_type)
|
||||
@@ -177,7 +181,7 @@
|
||||
possible_turfs -= T
|
||||
return possible_turfs
|
||||
|
||||
/datum/mob_hunt/proc/calc_dam_multiplier(datum/mob_type/attack_type)
|
||||
/datum/mob_hunt/proc/calc_def_multiplier(datum/mob_type/attack_type)
|
||||
if(!primary_type)
|
||||
return 99 //typeless mobs are weak to everything since they shouldn't exist
|
||||
if(!attack_type) //typeless attacks will return a multiplier of 1 in case we want to use this for calculating unmodified damage for some reason (UI maybe?)
|
||||
@@ -207,36 +211,59 @@
|
||||
|
||||
/datum/mob_hunt/proc/take_damage(raw_damage, datum/mob_type/attack_type)
|
||||
var/message = ""
|
||||
var/multiplier = calc_dam_multiplier(attack_type)
|
||||
var/multiplier = calc_def_multiplier(attack_type)
|
||||
var/total_damage = raw_damage * multiplier
|
||||
if(!health["current"]) //it's already downed, quit hitting it
|
||||
if(!cur_health) //it's already downed, quit hitting it
|
||||
return null
|
||||
health["current"] = max(health["current"] - total_damage, 0)
|
||||
switch(multiplier)
|
||||
if(0)
|
||||
message += "The attack is completely ineffective! "
|
||||
if(0.25)
|
||||
message += "It's barely effective... "
|
||||
if(0.5)
|
||||
message += "It's not very effective... "
|
||||
if(2)
|
||||
message += "It's super effective! "
|
||||
if(4)
|
||||
message += "It's ultra effective! "
|
||||
if(!health["current"])
|
||||
if(!total_damage)
|
||||
message += "The attack is completely ineffective! "
|
||||
else
|
||||
cur_health = max(cur_health - total_damage, 0)
|
||||
switch(multiplier)
|
||||
if(0)
|
||||
message += "The attack is completely ineffective! "
|
||||
if(0.25)
|
||||
message += "It's barely effective... "
|
||||
if(0.5)
|
||||
message += "It's not very effective... "
|
||||
if(2)
|
||||
message += "It's super effective! "
|
||||
if(4)
|
||||
message += "It's ultra effective! "
|
||||
if(99)
|
||||
message += pick("REKT! ", "DUNKED! ", "DEFENSE BREAK! ", "WOMBO-COMBO'D!")
|
||||
if(!cur_health)
|
||||
message += "[nickname ? nickname : mob_name] is downed!"
|
||||
return message
|
||||
|
||||
/datum/mob_hunt/proc/get_raw_damage()
|
||||
return (level * attack_multiplier)
|
||||
|
||||
/datum/mob_hunt/proc/get_attack_type()
|
||||
var/datum/mob_type/attack_type = primary_type
|
||||
if(secondary_type && prob(40))
|
||||
attack_type = secondary_type
|
||||
return attack_type
|
||||
|
||||
/datum/mob_hunt/proc/gain_exp()
|
||||
exp++
|
||||
var/message = "[nickname ? nickname : mob_name] gained EXP! ([exp] / [exp_to_level] EXP)"
|
||||
if(exp >= exp_to_level)
|
||||
message = levelup()
|
||||
return message
|
||||
|
||||
/datum/mob_hunt/proc/levelup()
|
||||
var/message = ""
|
||||
level++
|
||||
exp = 0
|
||||
if(level > max_level) //This is where we would trigger an evolution, when those are added (need to add evolved forms first)
|
||||
level = max_level //for now though, we'll just cap them back at their max_level
|
||||
message += "[nickname ? nickname : mob_name] can't get any stronger right now!"
|
||||
else
|
||||
|
||||
health["max"] = base_health + (level * health_multiplier)
|
||||
max_health = base_health + (level * health_multiplier)
|
||||
cur_health = max_health //full heal on level-up
|
||||
message += "[nickname ? nickname : mob_name] has reached level [level]!"
|
||||
return message
|
||||
|
||||
/datum/mob_hunt/proc/get_type1()
|
||||
if(!primary_type)
|
||||
|
||||
Reference in New Issue
Block a user