mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 10:12:45 +00:00
242 lines
7.4 KiB
Plaintext
242 lines
7.4 KiB
Plaintext
/atom/movable/proc/get_mob()
|
|
return
|
|
|
|
/obj/mecha/get_mob()
|
|
return occupant
|
|
|
|
/obj/vehicle/train/get_mob()
|
|
return buckled_mob
|
|
|
|
/mob/get_mob()
|
|
return src
|
|
|
|
/mob/living/bot/mulebot/get_mob()
|
|
if(load && istype(load, /mob/living))
|
|
return list(src, load)
|
|
return src
|
|
|
|
/proc/mobs_in_view(var/range, var/source)
|
|
var/list/mobs = list()
|
|
for(var/atom/movable/AM in view(range, source))
|
|
var/M = AM.get_mob()
|
|
if(M)
|
|
mobs += M
|
|
|
|
return mobs
|
|
|
|
proc/random_hair_style(gender, species = "Human")
|
|
var/h_style = "Bald"
|
|
|
|
var/list/valid_hairstyles = list()
|
|
for(var/hairstyle in hair_styles_list)
|
|
var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
|
|
if(gender == MALE && S.gender == FEMALE)
|
|
continue
|
|
if(gender == FEMALE && S.gender == MALE)
|
|
continue
|
|
if( !(species in S.species_allowed))
|
|
continue
|
|
valid_hairstyles[hairstyle] = hair_styles_list[hairstyle]
|
|
|
|
if(valid_hairstyles.len)
|
|
h_style = pick(valid_hairstyles)
|
|
|
|
return h_style
|
|
|
|
proc/random_facial_hair_style(gender, species = "Human")
|
|
var/f_style = "Shaved"
|
|
|
|
var/list/valid_facialhairstyles = list()
|
|
for(var/facialhairstyle in facial_hair_styles_list)
|
|
var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
|
|
if(gender == MALE && S.gender == FEMALE)
|
|
continue
|
|
if(gender == FEMALE && S.gender == MALE)
|
|
continue
|
|
if( !(species in S.species_allowed))
|
|
continue
|
|
|
|
valid_facialhairstyles[facialhairstyle] = facial_hair_styles_list[facialhairstyle]
|
|
|
|
if(valid_facialhairstyles.len)
|
|
f_style = pick(valid_facialhairstyles)
|
|
|
|
return f_style
|
|
|
|
proc/sanitize_name(name, species = "Human", robot = 0)
|
|
var/datum/species/current_species
|
|
if(species)
|
|
current_species = all_species[species]
|
|
|
|
return current_species ? current_species.sanitize_name(name, robot) : sanitizeName(name, MAX_NAME_LEN, robot)
|
|
|
|
proc/random_name(gender, species = "Human")
|
|
|
|
var/datum/species/current_species
|
|
if(species)
|
|
current_species = all_species[species]
|
|
|
|
if(!current_species || current_species.name_language == null)
|
|
if(gender==FEMALE)
|
|
return capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names))
|
|
else
|
|
return capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
|
|
else
|
|
return current_species.get_random_name(gender)
|
|
|
|
proc/random_skin_tone()
|
|
switch(pick(60;"caucasian", 15;"afroamerican", 10;"african", 10;"latino", 5;"albino"))
|
|
if("caucasian") . = -10
|
|
if("afroamerican") . = -115
|
|
if("african") . = -165
|
|
if("latino") . = -55
|
|
if("albino") . = 34
|
|
else . = rand(-185,34)
|
|
return min(max( .+rand(-25, 25), -185),34)
|
|
|
|
proc/skintone2racedescription(tone)
|
|
switch (tone)
|
|
if(30 to INFINITY) return "albino"
|
|
if(20 to 30) return "pale"
|
|
if(5 to 15) return "light skinned"
|
|
if(-10 to 5) return "white"
|
|
if(-25 to -10) return "tan"
|
|
if(-45 to -25) return "darker skinned"
|
|
if(-65 to -45) return "brown"
|
|
if(-INFINITY to -65) return "black"
|
|
else return "unknown"
|
|
|
|
proc/age2agedescription(age)
|
|
switch(age)
|
|
if(0 to 1) return "infant"
|
|
if(1 to 3) return "toddler"
|
|
if(3 to 13) return "child"
|
|
if(13 to 19) return "teenager"
|
|
if(19 to 30) return "young adult"
|
|
if(30 to 45) return "adult"
|
|
if(45 to 60) return "middle-aged"
|
|
if(60 to 70) return "aging"
|
|
if(70 to INFINITY) return "elderly"
|
|
else return "unknown"
|
|
|
|
/proc/RoundHealth(health)
|
|
var/list/icon_states = icon_states('icons/mob/hud_med.dmi')
|
|
for(var/icon_state in icon_states)
|
|
if(health >= text2num(icon_state))
|
|
return icon_state
|
|
return icon_states[icon_states.len] // If we had no match, return the last element
|
|
|
|
/*
|
|
Proc for attack log creation, because really why not
|
|
1 argument is the actor
|
|
2 argument is the target of action
|
|
3 is the description of action(like punched, throwed, or any other verb)
|
|
4 should it make adminlog note or not
|
|
5 is the tool with which the action was made(usually item) 5 and 6 are very similar(5 have "by " before it, that it) and are separated just to keep things in a bit more in order
|
|
6 is additional information, anything that needs to be added
|
|
*/
|
|
|
|
/proc/add_logs(mob/user, mob/target, what_done, var/admin=1, var/object=null, var/addition=null)
|
|
if(user && ismob(user))
|
|
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Has [what_done] [target ? "[target.name][(ismob(target) && target.ckey) ? "([target.ckey])" : ""]" : "NON-EXISTANT SUBJECT"][object ? " with [object]" : " "][addition]</font>")
|
|
if(target && ismob(target))
|
|
target.attack_log += text("\[[time_stamp()]\] <font color='orange'>Has been [what_done] by [user ? "[user.name][(ismob(user) && user.ckey) ? "([user.ckey])" : ""]" : "NON-EXISTANT SUBJECT"][object ? " with [object]" : " "][addition]</font>")
|
|
if(admin)
|
|
log_attack("<font color='red'>[user ? "[user.name][(ismob(user) && user.ckey) ? "([user.ckey])" : ""]" : "NON-EXISTANT SUBJECT"] [what_done] [target ? "[target.name][(ismob(target) && target.ckey)? "([target.ckey])" : ""]" : "NON-EXISTANT SUBJECT"][object ? " with [object]" : " "][addition]</font>")
|
|
|
|
//checks whether this item is a module of the robot it is located in.
|
|
/proc/is_robot_module(var/obj/item/thing)
|
|
if (!thing || !istype(thing.loc, /mob/living/silicon/robot))
|
|
return 0
|
|
var/mob/living/silicon/robot/R = thing.loc
|
|
return (thing in R.module.modules)
|
|
|
|
/proc/get_exposed_defense_zone(var/atom/movable/target)
|
|
var/obj/item/weapon/grab/G = locate() in target
|
|
if(G && G.state >= GRAB_NECK) //works because mobs are currently not allowed to upgrade to NECK if they are grabbing two people.
|
|
return pick("head", "l_hand", "r_hand", "l_foot", "r_foot", "l_arm", "r_arm", "l_leg", "r_leg")
|
|
else
|
|
return pick("chest", "groin")
|
|
|
|
/proc/do_mob(mob/user , mob/target, time = 30, target_zone = 0, uninterruptible = 0, progress = 1)
|
|
if(!user || !target)
|
|
return 0
|
|
var/user_loc = user.loc
|
|
var/target_loc = target.loc
|
|
|
|
var/holding = user.get_active_hand()
|
|
var/datum/progressbar/progbar
|
|
if (progress)
|
|
progbar = new(user, time, target)
|
|
|
|
var/endtime = world.time+time
|
|
var/starttime = world.time
|
|
. = 1
|
|
while (world.time < endtime)
|
|
sleep(1)
|
|
if (progress)
|
|
progbar.update(world.time - starttime)
|
|
if(!user || !target)
|
|
. = 0
|
|
break
|
|
if(uninterruptible)
|
|
continue
|
|
|
|
if(!user || user.incapacitated() || user.loc != user_loc)
|
|
. = 0
|
|
break
|
|
|
|
if(target.loc != target_loc)
|
|
. = 0
|
|
break
|
|
|
|
if(user.get_active_hand() != holding)
|
|
. = 0
|
|
break
|
|
|
|
if(target_zone && user.zone_sel.selecting != target_zone)
|
|
. = 0
|
|
break
|
|
|
|
if (progbar)
|
|
qdel(progbar)
|
|
|
|
/proc/do_after(mob/user, delay, atom/target = null, needhand = 1, progress = 1, var/incapacitation_flags = INCAPACITATION_DEFAULT)
|
|
if(!user)
|
|
return 0
|
|
var/atom/target_loc = null
|
|
if(target)
|
|
target_loc = target.loc
|
|
|
|
var/atom/original_loc = user.loc
|
|
|
|
var/holding = user.get_active_hand()
|
|
|
|
var/datum/progressbar/progbar
|
|
if (progress)
|
|
progbar = new(user, delay, target)
|
|
|
|
var/endtime = world.time + delay
|
|
var/starttime = world.time
|
|
. = 1
|
|
while (world.time < endtime)
|
|
sleep(1)
|
|
if (progress)
|
|
progbar.update(world.time - starttime)
|
|
|
|
if(!user || user.incapacitated(incapacitation_flags) || user.loc != original_loc)
|
|
. = 0
|
|
break
|
|
|
|
if(target_loc && (!target || target_loc != target.loc))
|
|
. = 0
|
|
break
|
|
|
|
if(needhand)
|
|
if(user.get_active_hand() != holding)
|
|
. = 0
|
|
break
|
|
|
|
if (progbar)
|
|
qdel(progbar)
|