/atom/movable/proc/get_mob() return /obj/machinery/bot/mulebot/get_mob() if(load && istype(load,/mob/living)) return load /obj/mecha/get_mob() return occupant /obj/vehicle/train/get_mob() return buckled_mob /mob/get_mob() return src /proc/mobs_in_view(var/range, var/source) . = list() for(var/atom/movable/AM in view(range, source)) if (ismob(AM)) . += AM continue if (!AM.can_hold_mob) continue . += AM.get_mob() 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") var/datum/species/current_species if(species) current_species = all_species[species] return current_species ? current_species.sanitize_name(name) : sanitizeName(name) 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) switch(health) if(100 to INFINITY) return "health100" if(90 to 100) return "health95" if(70 to 90) return "health80" if(50 to 70) return "health60" if(30 to 50) return "health40" if(18 to 30) return "health25" if(5 to 18) return "health10" if(1 to 5) return "health1" if(-99 to 0) return "health0" else return "health-100" return "0" /* 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()]\] Has [what_done] [target ? "[target.name][(ismob(target) && target.ckey) ? "([target.ckey])" : ""]" : "NON-EXISTANT SUBJECT"][object ? " with [object]" : " "][addition]") if(target && ismob(target)) target.attack_log += text("\[[time_stamp()]\] Has been [what_done] by [user ? "[user.name][(ismob(user) && user.ckey) ? "([user.ckey])" : ""]" : "NON-EXISTANT SUBJECT"][object ? " with [object]" : " "][addition]") if(admin) log_attack("[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]",ckey=key_name(user),ckey_target=key_name(target)) //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") // Returns true if M was not already in the dead mob list /mob/proc/switch_from_living_to_dead_mob_list() remove_from_living_mob_list() . = add_to_dead_mob_list() // Returns true if M was not already in the living mob list /mob/proc/switch_from_dead_to_living_mob_list() remove_from_dead_mob_list() . = add_to_living_mob_list() // Returns true if the mob was in neither the dead or living list /mob/proc/add_to_living_mob_list() return FALSE /mob/living/add_to_living_mob_list() if((src in living_mob_list) || (src in dead_mob_list)) return FALSE living_mob_list += src return TRUE // Returns true if the mob was removed from the living list /mob/proc/remove_from_living_mob_list() return living_mob_list.Remove(src) // Returns true if the mob was in neither the dead or living list /mob/proc/add_to_dead_mob_list() return FALSE /mob/living/add_to_dead_mob_list() if((src in living_mob_list) || (src in dead_mob_list)) return FALSE dead_mob_list += src return TRUE // Returns true if the mob was removed form the dead list /mob/proc/remove_from_dead_mob_list() return dead_mob_list.Remove(src)