diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm index 3469779fda2..0a1e72592db 100644 --- a/code/_helpers/global_lists_vr.dm +++ b/code/_helpers/global_lists_vr.dm @@ -169,7 +169,6 @@ var/global/list/edible_trash = list(/obj/item/broken_device, /obj/item/weapon/pen, /obj/item/weapon/photo, /obj/item/weapon/reagent_containers/food, - /obj/item/weapon/reagent_containers/glass/bottle, /obj/item/weapon/reagent_containers/glass/rag, /obj/item/weapon/soap, /obj/item/weapon/spacecash, diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index b75de6685e6..0c7596ed847 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -48,14 +48,16 @@ var/ooc_style = "everyone" if(holder && !holder.fakekey) ooc_style = "elevated" - if(holder.rights & R_EVENT) + //VOREStation Block Edit Start + if(holder.rights & R_EVENT) //Retired Admins ooc_style = "event_manager" - if(holder.rights & R_MOD) + if(holder.rights & R_ADMIN && !(holder.rights & R_BAN)) //Game Masters ooc_style = "moderator" - if(holder.rights & R_DEBUG) + if(holder.rights & R_SERVER && !(holder.rights & R_BAN)) //Developers ooc_style = "developer" - if(holder.rights & R_ADMIN) + if(holder.rights & R_ADMIN && holder.rights & R_BAN) //Admins ooc_style = "admin" + //VOREStation Block Edit End for(var/client/target in GLOB.clients) if(target.is_preference_enabled(/datum/client_preference/show_ooc)) diff --git a/code/game/verbs/who.dm b/code/game/verbs/who.dm index a8100038a82..b30d73e421d 100644 --- a/code/game/verbs/who.dm +++ b/code/game/verbs/who.dm @@ -77,7 +77,7 @@ var/num_event_managers_online = 0 if(holder) for(var/client/C in admins) - if(R_ADMIN & C.holder.rights || (!R_MOD & C.holder.rights && !R_EVENT & C.holder.rights)) //Used to determine who shows up in admin rows + if(R_ADMIN & C.holder.rights && R_BAN & C.holder.rights) //VOREStation Edit if(C.holder.fakekey && (!R_ADMIN & holder.rights && !R_MOD & holder.rights)) //Event Managerss can't see stealthmins continue @@ -102,9 +102,16 @@ msg += "\n" num_admins_online++ - else if(R_MOD & C.holder.rights) //Who shows up in mod rows. + else if(R_ADMIN & C.holder.rights && !(R_SERVER & C.holder.rights)) //VOREStation Edit modmsg += "\t[C] is a [C.holder.rank]" + //VOREStation Addition Start + if(C.holder.fakekey && (!R_ADMIN & holder.rights && !R_MOD & holder.rights)) + continue + if(C.holder.fakekey) + msg += " (as [C.holder.fakekey])" + //VOREStation Addition End + if(isobserver(C.mob)) modmsg += " - Observing" else if(istype(C.mob,/mob/new_player)) @@ -120,8 +127,14 @@ modmsg += "\n" num_mods_online++ - else if(R_SERVER & C.holder.rights) + else if(R_SERVER & C.holder.rights) //VOREStation Edit + //VOREStation Edit Start - Adds Stealthmin support + if(C.holder.fakekey && (!R_ADMIN & holder.rights && !R_MOD & holder.rights)) + continue devmsg += "\t[C] is a [C.holder.rank]" + if(C.holder.fakekey) + devmsg += " (as [C.holder.fakekey])" + //VOREStation Edit End if(isobserver(C.mob)) devmsg += " - Observing" else if(istype(C.mob,/mob/new_player)) @@ -137,8 +150,14 @@ devmsg += "\n" num_devs_online++ - else if(R_EVENT & C.holder.rights) + else //VOREStation Edit + //VOREStation Edit Start - Adds Stealthmin support + if(C.holder.fakekey && (!R_ADMIN & holder.rights && !R_MOD & holder.rights)) + continue eventMmsg += "\t[C] is a [C.holder.rank]" + if(C.holder.fakekey) + eventMmsg += " (as [C.holder.fakekey])" + //VOREStation Edit End if(isobserver(C.mob)) eventMmsg += " - Observing" else if(istype(C.mob,/mob/new_player)) @@ -156,31 +175,36 @@ else for(var/client/C in admins) - if(R_ADMIN & C.holder.rights || (!R_MOD & C.holder.rights && !R_EVENT & C.holder.rights)) + if(R_ADMIN & C.holder.rights && R_BAN & C.holder.rights) //VOREStation Edit if(!C.holder.fakekey) msg += "\t[C] is a [C.holder.rank]\n" num_admins_online++ - else if (R_MOD & C.holder.rights) - modmsg += "\t[C] is a [C.holder.rank]\n" - num_mods_online++ - else if (R_SERVER & C.holder.rights) - devmsg += "\t[C] is a [C.holder.rank]\n" - num_devs_online++ - else if (R_EVENT & C.holder.rights) - eventMmsg += "\t[C] is a [C.holder.rank]\n" - num_event_managers_online++ + //VOREStation Block Edit Start + else if(R_ADMIN & C.holder.rights && !(R_SERVER & C.holder.rights)) + if(!C.holder.fakekey) + modmsg += "\t[C] is a [C.holder.rank]\n" + num_mods_online++ + else if(R_SERVER & C.holder.rights) + if(!C.holder.fakekey) + devmsg += "\t[C] is a [C.holder.rank]\n" + num_devs_online++ + else + if(!C.holder.fakekey) + eventMmsg += "\t[C] is a [C.holder.rank]\n" + num_event_managers_online++ + //VOREStation Block Edit End if(config.admin_irc) to_chat(src, "Adminhelps are also sent to IRC. If no admins are available in game try anyway and an admin on IRC may see it and respond.") msg = "Current Admins ([num_admins_online]):\n" + msg if(config.show_mods) - msg += "\n Current Moderators ([num_mods_online]):\n" + modmsg + msg += "\n Current Game Masters ([num_mods_online]):\n" + modmsg //VOREStation Edit if(config.show_devs) msg += "\n Current Developers ([num_devs_online]):\n" + devmsg if(config.show_event_managers) - msg += "\n Current Event Managers ([num_event_managers_online]):\n" + eventMmsg + msg += "\n Current Miscellaneous ([num_event_managers_online]):\n" + eventMmsg //VOREStation Edit src << msg diff --git a/code/modules/admin/admin_secrets.dm b/code/modules/admin/admin_secrets.dm index 5f04582acea..a0e5e248045 100644 --- a/code/modules/admin/admin_secrets.dm +++ b/code/modules/admin/admin_secrets.dm @@ -99,18 +99,18 @@ var/datum/admin_secrets/admin_secrets = new() /datum/admin_secret_item/admin_secret category = /datum/admin_secret_category/admin_secrets log = 0 - permissions = R_ADMIN|R_EVENT + permissions = R_ADMIN //VOREStation Edit /datum/admin_secret_item/random_event category = /datum/admin_secret_category/random_events - permissions = R_FUN|R_EVENT + permissions = R_FUN //VOREStation Edit warn_before_use = 1 /datum/admin_secret_item/fun_secret category = /datum/admin_secret_category/fun_secrets - permissions = R_FUN|R_EVENT + permissions = R_FUN //VOREStation Edit warn_before_use = 1 /datum/admin_secret_item/final_solution category = /datum/admin_secret_category/final_solutions - permissions = R_FUN|R_SERVER|R_ADMIN|R_EVENT + permissions = R_FUN|R_SERVER|R_ADMIN //VOREStation Edit diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index cb111adc9c9..331eb87873c 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -358,52 +358,13 @@ var/list/admin_verbs_mod = list( /datum/admins/proc/view_atk_log //shows the server combat-log, doesn't do anything presently, ) +//VOREStation Edit Start - Highly Modified List var/list/admin_verbs_event_manager = list( - /client/proc/cmd_event_say, - /client/proc/cmd_admin_pm_context, - /client/proc/cmd_admin_pm_panel, - /datum/admins/proc/PlayerNotes, - /client/proc/admin_ghost, - /datum/admins/proc/show_player_info, - /client/proc/dsay, - /client/proc/cmd_admin_subtle_message, - /client/proc/debug_variables, - /client/proc/check_antagonists, - /client/proc/aooc, - /datum/admins/proc/paralyze_mob, - /client/proc/cmd_admin_direct_narrate, - /client/proc/allow_character_respawn, - /datum/admins/proc/sendFax, - /client/proc/respawn_character, - /proc/possess, - /proc/release, - /client/proc/callproc, - /client/proc/callproc_datum, - /client/proc/debug_controller, - /client/proc/show_gm_status, - /datum/admins/proc/change_weather, - /datum/admins/proc/change_time, - /client/proc/admin_give_modifier, - /client/proc/Jump, - /client/proc/jumptomob, - /client/proc/jumptocoord, - /client/proc/cmd_admin_delete, - /datum/admins/proc/delay, - /client/proc/Set_Holiday, - /client/proc/make_sound, - /client/proc/toggle_random_events, - /datum/admins/proc/cmd_admin_dress, - /client/proc/cmd_admin_gib_self, - /client/proc/drop_bomb, - /client/proc/cmd_admin_add_freeform_ai_law, - /client/proc/cmd_admin_add_random_ai_law, - /client/proc/make_sound, - /client/proc/toggle_random_events, - /client/proc/editappear, - /client/proc/roll_dices, - /datum/admins/proc/call_supply_drop, - /datum/admins/proc/call_drop_pod + /client/proc/cmd_admin_say, //admin-only ooc chat, + /client/proc/cmd_mod_say, + /client/proc/cmd_event_say ) +//VOREStation Edit End /client/proc/add_admin_verbs() if(holder) diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 284db26a7fe..63959aed867 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -251,7 +251,7 @@ href_list["secretsadmin"] = "check_antagonist" else if(href_list["delay_round_end"]) - if(!check_rights(R_SERVER|R_EVENT)) return + if(!check_rights(R_SERVER)) return //VOREStation Edit ticker.delay_end = !ticker.delay_end log_admin("[key_name(usr)] [ticker.delay_end ? "delayed the round end" : "has made the round end normally"].") @@ -1238,7 +1238,7 @@ show_player_panel(M) else if(href_list["adminplayerobservejump"]) - if(!check_rights(R_EVENT|R_MOD|R_ADMIN|R_SERVER|R_EVENT)) return + if(!check_rights(R_MOD|R_ADMIN|R_SERVER)) return //VOREStation Edit var/mob/M = locate(href_list["adminplayerobservejump"]) @@ -1248,7 +1248,7 @@ C.jumptomob(M) else if(href_list["adminplayerobservefollow"]) - if(!check_rights(R_EVENT|R_MOD|R_ADMIN|R_SERVER|R_EVENT)) + if(!check_rights(R_MOD|R_ADMIN|R_SERVER)) //VOREStation Edit return var/mob/M = locate(href_list["adminplayerobservefollow"]) @@ -1268,7 +1268,7 @@ if(ismob(M)) var/take_msg = "ADMINHELP: [key_name(usr.client)] is attending to [key_name(M)]'s adminhelp, please don't dogpile them." for(var/client/X in admins) - if((R_ADMIN|R_MOD|R_EVENT|R_SERVER) & X.holder.rights) + if((R_ADMIN|R_MOD|R_SERVER) & X.holder.rights) //VOREStation Edit to_chat(X, take_msg) to_chat(M, "Your adminhelp is being attended to by [usr.client]. Thanks for your patience!") // VoreStation Edit Start @@ -1284,7 +1284,7 @@ to_chat(usr, "Unable to locate mob.") else if(href_list["adminplayerobservecoodjump"]) - if(!check_rights(R_ADMIN|R_SERVER|R_MOD|R_EVENT)) return + if(!check_rights(R_ADMIN|R_SERVER|R_MOD)) return //VOREStation Edit var/x = text2num(href_list["X"]) var/y = text2num(href_list["Y"]) @@ -1876,7 +1876,7 @@ vsc.SetDefault(usr) else if(href_list["toglang"]) - if(check_rights(R_SPAWN|R_EVENT)) + if(check_rights(R_SPAWN)) //VOREStation Edit var/mob/M = locate(href_list["toglang"]) if(!istype(M)) usr << "[M] is illegal type, must be /mob!" diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm index 0fdc158227f..200a742b8cd 100644 --- a/code/modules/admin/verbs/adminsay.dm +++ b/code/modules/admin/verbs/adminsay.dm @@ -2,7 +2,7 @@ set category = "Special Verbs" set name = "Asay" //Gave this shit a shorter name so you only have to time out "asay" rather than "admin say" to use it --NeoFite set hidden = 1 - if(!check_rights(R_ADMIN)) + if(!check_rights(R_ADMIN|R_STEALTH)) //VOREStation Edit return msg = sanitize(msg) @@ -11,10 +11,11 @@ log_adminsay(msg,src) - if(check_rights(R_ADMIN,0)) - for(var/client/C in admins) - if(R_ADMIN & C.holder.rights) - C << "" + create_text_tag("admin", "ADMIN:", C) + " [key_name(usr, 1)]([admin_jump_link(mob, src)]): [msg]" + //VOREStation Edit Start - Adds R_EVENT + for(var/client/C in admins) + if(check_rights(R_ADMIN|R_EVENT)) + C << "" + create_text_tag("admin", "ADMIN:", C) + " [key_name(usr, 1)]([admin_jump_link(mob, src)]): [msg]" + //VOREStation Edit End feedback_add_details("admin_verb","M") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! @@ -23,7 +24,7 @@ set name = "Msay" set hidden = 1 - if(!check_rights(R_ADMIN|R_MOD|R_SERVER)) + if(!check_rights(R_ADMIN|R_MOD|R_SERVER|R_EVENT)) //VOREStation Edit return msg = sanitize(msg) @@ -36,7 +37,7 @@ if(check_rights(R_ADMIN, 0)) sender_name = "[sender_name]" for(var/client/C in admins) - if(check_rights(R_ADMIN|R_MOD|R_SERVER)) + if(check_rights(R_ADMIN|R_MOD|R_SERVER|R_STEALTH)) //VOREStation Edit C << "" + create_text_tag("mod", "MOD:", C) + " [sender_name]([admin_jump_link(mob, C.holder)]): [msg]" feedback_add_details("admin_verb","MS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 1a3fbfe76f5..3367b988529 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -615,7 +615,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set category = "Special Verbs" set name = "Explosion" - if(!check_rights(R_DEBUG|R_FUN|R_EVENT)) return + if(!check_rights(R_DEBUG|R_FUN)) return //VOREStation Edit var/devastation = input("Range of total devastation. -1 to none", text("Input")) as num|null if(devastation == null) return @@ -643,7 +643,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set category = "Special Verbs" set name = "EM Pulse" - if(!check_rights(R_DEBUG|R_FUN|R_EVENT)) return + if(!check_rights(R_DEBUG|R_FUN)) return //VOREStation Edit var/heavy = input("Range of heavy pulse.", text("Input")) as num|null if(heavy == null) return @@ -669,7 +669,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set category = "Special Verbs" set name = "Gib" - if(!check_rights(R_ADMIN|R_FUN|R_EVENT)) return + if(!check_rights(R_ADMIN|R_FUN)) return //VOREStation Edit var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No") if(confirm != "Yes") return @@ -826,7 +826,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if ((!( ticker ) || !emergency_shuttle.location())) return - if(!check_rights(R_ADMIN|R_EVENT)) return + if(!check_rights(R_ADMIN)) return //VOREStation Edit var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No") if(confirm != "Yes") return @@ -855,7 +855,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set category = "Admin" set name = "Cancel Shuttle" - if(!check_rights(R_ADMIN|R_EVENT)) return + if(!check_rights(R_ADMIN)) return //VOREStation Edit if(alert(src, "You sure?", "Confirm", "Yes", "No") != "Yes") return @@ -876,7 +876,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if (!ticker) return - if(!check_rights(R_ADMIN|R_EVENT)) return + if(!check_rights(R_ADMIN)) return //VOREStation Edit emergency_shuttle.deny_shuttle = !emergency_shuttle.deny_shuttle @@ -932,7 +932,7 @@ Traitors and the like can also be revived with the previous role mostly intact. set name = "Toggle random events on/off" set desc = "Toggles random events such as meteors, black holes, blob (but not space dust) on/off" - if(!check_rights(R_SERVER|R_EVENT)) return + if(!check_rights(R_SERVER)) return //VOREStation Edit if(!config.allow_random_events) config.allow_random_events = 1 diff --git a/code/modules/mob/living/simple_animal/aliens/alien.dm b/code/modules/mob/living/simple_animal/aliens/alien.dm deleted file mode 100644 index 861d79648e2..00000000000 --- a/code/modules/mob/living/simple_animal/aliens/alien.dm +++ /dev/null @@ -1,142 +0,0 @@ -/mob/living/simple_mob/hostile/alien - name = "alien hunter" - desc = "Hiss!" - icon = 'icons/mob/alien.dmi' - icon_state = "alienh_running" - icon_living = "alienh_running" - icon_dead = "alien_l" - icon_gib = "syndicate_gib" - icon_rest = "alienh_sleep" - - faction = "xeno" - intelligence_level = SA_HUMANOID - cooperative = 1 - run_at_them = 0 - - response_help = "pokes" - response_disarm = "shoves" - response_harm = "hits" - - maxHealth = 100 - health = 100 - speed = -1 - - harm_intent_damage = 5 - melee_damage_lower = 25 - melee_damage_upper = 25 - attack_sharp = 1 - attack_edge = 1 - - attacktext = list("slashed") - attack_sound = 'sound/weapons/bladeslice.ogg' - a_intent = I_HURT - - environment_smash = 2 - status_flags = CANPUSH - - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - minbodytemp = 0 - heat_damage_per_tick = 20 - unsuitable_atoms_damage = 15 - - meat_type = /obj/item/weapon/reagent_containers/food/snacks/xenomeat - -/mob/living/simple_mob/hostile/alien/drone - name = "alien drone" - icon_state = "aliend_running" - icon_living = "aliend_running" - icon_dead = "aliend_l" - icon_rest = "aliend_sleep" - health = 60 - melee_damage_lower = 15 - melee_damage_upper = 15 - -/mob/living/simple_mob/hostile/alien/sentinel - name = "alien sentinel" - icon_state = "aliens_running" - icon_living = "aliens_running" - icon_dead = "aliens_l" - icon_rest = "aliens_sleep" - health = 120 - melee_damage_lower = 15 - melee_damage_upper = 15 - ranged = 1 - projectiletype = /obj/item/projectile/energy/neurotoxin/toxic - projectilesound = 'sound/weapons/pierce.ogg' - -/mob/living/simple_mob/hostile/alien/sentinel/praetorian - name = "alien praetorian" - icon = 'icons/mob/64x64.dmi' - icon_state = "prat_s" - icon_living = "prat_s" - icon_dead = "prat_dead" - icon_rest = "prat_sleep" - move_to_delay = 5 - maxHealth = 200 - health = 200 - - pixel_x = -16 - old_x = -16 - meat_amount = 5 - -/mob/living/simple_mob/hostile/alien/queen - name = "alien queen" - icon_state = "alienq_running" - icon_living = "alienq_running" - icon_dead = "alienq_l" - icon_rest = "alienq_sleep" - health = 250 - maxHealth = 250 - melee_damage_lower = 15 - melee_damage_upper = 15 - ranged = 1 - move_to_delay = 3 - projectiletype = /obj/item/projectile/energy/neurotoxin/toxic - projectilesound = 'sound/weapons/pierce.ogg' - rapid = 1 - status_flags = 0 - -/mob/living/simple_mob/hostile/alien/queen/empress - name = "alien empress" - icon = 'icons/mob/64x64.dmi' - icon_state = "queen_s" - icon_living = "queen_s" - icon_dead = "queen_dead" - icon_rest = "queen_sleep" - move_to_delay = 4 - maxHealth = 400 - health = 400 - meat_amount = 5 - speed = 1 - - pixel_x = -16 - old_x = -16 - -/mob/living/simple_mob/hostile/alien/queen/empress/mother - name = "alien mother" - icon = 'icons/mob/96x96.dmi' - icon_state = "empress_s" - icon_living = "empress_s" - icon_dead = "empress_dead" - icon_rest = "empress_rest" - maxHealth = 600 - health = 600 - meat_amount = 10 - melee_damage_lower = 15 - melee_damage_upper = 25 - speed = 2 - - pixel_x = -32 - old_x = -32 - -/mob/living/simple_mob/hostile/alien/death() - ..() - visible_message("[src] lets out a waning guttural screech, green blood bubbling from its maw...") - playsound(src, 'sound/voice/hiss6.ogg', 100, 1) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/aliens/creature.dm b/code/modules/mob/living/simple_animal/aliens/creature.dm deleted file mode 100644 index 65dcd326fad..00000000000 --- a/code/modules/mob/living/simple_animal/aliens/creature.dm +++ /dev/null @@ -1,78 +0,0 @@ -/mob/living/simple_mob/hostile/creature - name = "creature" - desc = "A sanity-destroying otherthing." - icon = 'icons/mob/critter.dmi' - icon_state = "otherthing" - icon_living = "otherthing" - icon_dead = "otherthing-dead" - - faction = "creature" - intelligence_level = SA_ANIMAL - maxHealth = 40 - health = 40 - speed = 8 - - harm_intent_damage = 8 - - melee_damage_lower = 8 - melee_damage_upper = 15 - attack_armor_pen = 5 //It's a horror from beyond, I ain't gotta explain 5 AP - attack_sharp = 1 - attack_edge = 1 - - attacktext = list("chomped") - attack_sound = 'sound/weapons/bite.ogg' - - speak_emote = list("gibbers") - -/mob/living/simple_mob/hostile/creature/cult - faction = "cult" - - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - minbodytemp = 0 - - supernatural = 1 - -/mob/living/simple_mob/hostile/creature/cult/cultify() - return - -/mob/living/simple_mob/hostile/creature/cult/Life() - ..() - check_horde() - -/mob/living/simple_mob/hostile/creature/strong - maxHealth = 160 - health = 160 - - harm_intent_damage = 5 - melee_damage_lower = 13 - melee_damage_upper = 25 - -/mob/living/simple_mob/hostile/creature/strong/cult - faction = "cult" - - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - minbodytemp = 0 - - supernatural = 1 - -/mob/living/simple_mob/hostile/creature/cult/cultify() - return - -/mob/living/simple_mob/hostile/creature/cult/Life() - ..() - check_horde() diff --git a/code/modules/mob/living/simple_animal/aliens/drone.dm b/code/modules/mob/living/simple_animal/aliens/drone.dm deleted file mode 100644 index 70cf52731db..00000000000 --- a/code/modules/mob/living/simple_animal/aliens/drone.dm +++ /dev/null @@ -1,286 +0,0 @@ - -//malfunctioning combat drones -/mob/living/simple_mob/hostile/malf_drone - name = "combat drone" - desc = "An automated combat drone armed with state of the art weaponry and shielding." - icon_state = "drone3" - icon_living = "drone3" - icon_dead = "drone_dead" - - faction = "malf_drone" - intelligence_level = SA_ROBOTIC - maxHealth = 300 - health = 300 - speed = 8 - stop_when_pulled = 0 - - turns_per_move = 3 - response_help = "pokes" - response_disarm = "gently pushes aside" - response_harm = "hits" - - a_intent = I_HURT - ranged = 1 - rapid = 1 - projectiletype = /obj/item/projectile/beam/drone - projectilesound = 'sound/weapons/laser3.ogg' - destroy_surroundings = 0 - hovering = TRUE - - armor = list(melee = 25, bullet = 25, laser = 25, energy = 10, bomb = 25, bio = 100, rad = 100) // Some level of armor plating makes sense - //Drones aren't affected by atmos. - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - minbodytemp = 0 - - speak_chance = 5 - speak = list("ALERT.","Hostile-ile-ile entities dee-twhoooo-wected.","Threat parameterszzzz- szzet.","Bring sub-sub-sub-systems uuuup to combat alert alpha-a-a.") - emote_see = list("beeps menacingly","whirrs threateningly","scans its immediate vicinity") - - - var/datum/effect/effect/system/ion_trail_follow/ion_trail - var/turf/patrol_target - var/explode_chance = 1 - var/disabled = 0 - var/exploding = 0 - var/has_loot = 1 - -/mob/living/simple_mob/hostile/malf_drone/New() - ..() - if(prob(5)) - projectiletype = /obj/item/projectile/beam/pulse/drone - projectilesound = 'sound/weapons/pulse2.ogg' - ion_trail = new - ion_trail.set_up(src) - ion_trail.start() - -/mob/living/simple_mob/hostile/malf_drone/Process_Spacemove(var/check_drift = 0) - return 1 - -/mob/living/simple_mob/hostile/malf_drone/isSynthetic() - return TRUE - -//self repair systems have a chance to bring the drone back to life -/mob/living/simple_mob/hostile/malf_drone/Life() - - //emps and lots of damage can temporarily shut us down - if(disabled > 0) - stat = UNCONSCIOUS - icon_state = "drone_dead" - disabled-- - wander = 0 - speak_chance = 0 - if(disabled <= 0) - stat = CONSCIOUS - icon_state = "drone0" - wander = 1 - speak_chance = 5 - - //repair a bit of damage - if(prob(1)) - src.visible_message("\icon[src] [src] shudders and shakes as some of it's damaged systems come back online.") - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(3, 1, src) - s.start() - health += rand(25,100) - - //spark for no reason - if(prob(5)) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(3, 1, src) - s.start() - - //sometimes our targetting sensors malfunction, and we attack anyone nearby - if(prob(disabled ? 0 : 1)) - if(hostile) - src.visible_message("\icon[src] [src] retracts several targetting vanes, and dulls it's running lights.") - hostile = 0 - else - src.visible_message("\icon[src] [src] suddenly lights up, and additional targetting vanes slide into place.") - hostile = 1 - - if(health / getMaxHealth() > 0.9) - icon_state = "drone3" - explode_chance = 0 - else if(health / getMaxHealth() > 0.7) - icon_state = "drone2" - explode_chance = 0 - else if(health / getMaxHealth() > 0.5) - icon_state = "drone1" - explode_chance = 0.5 - else if(health / getMaxHealth() > 0.3) - icon_state = "drone0" - explode_chance = 5 - else if(health > 0) - //if health gets too low, shut down - icon_state = "drone_dead" - exploding = 0 - if(!disabled) - if(prob(50)) - src.visible_message("\icon[src] [src] suddenly shuts down!") - else - src.visible_message("\icon[src] [src] suddenly lies still and quiet.") - disabled = rand(150, 600) - walk(src,0) - - if(exploding && prob(20)) - if(prob(50)) - src.visible_message("\icon[src] [src] begins to spark and shake violenty!") - else - src.visible_message("\icon[src] [src] sparks and shakes like it's about to explode!") - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(3, 1, src) - s.start() - - if(!exploding && !disabled && prob(explode_chance)) - exploding = 1 - stat = UNCONSCIOUS - wander = 1 - walk(src,0) - spawn(rand(50,150)) - if(!disabled && exploding) - explosion(get_turf(src), 0, 1, 4, 7) - //proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, adminlog = 1) - ..() - -//ion rifle! -/mob/living/simple_mob/hostile/malf_drone/emp_act(severity) - health -= rand(3,15) * (severity + 1) - disabled = rand(150, 600) - hostile = 0 - walk(src,0) - ..() - -/mob/living/simple_mob/hostile/malf_drone/death() - ..(null,"suddenly breaks apart.") - qdel(src) - -/mob/living/simple_mob/hostile/malf_drone/Destroy() - //More advanced than the default S_A loot system, for visual effect and random tech levels. - if(has_loot) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(3, 1, src) - s.start() - var/obj/O - - //shards - O = new /obj/item/weapon/material/shard(src.loc) - step_to(O, get_turf(pick(view(7, src)))) - if(prob(75)) - O = new /obj/item/weapon/material/shard(src.loc) - step_to(O, get_turf(pick(view(7, src)))) - if(prob(50)) - O = new /obj/item/weapon/material/shard(src.loc) - step_to(O, get_turf(pick(view(7, src)))) - if(prob(25)) - O = new /obj/item/weapon/material/shard(src.loc) - step_to(O, get_turf(pick(view(7, src)))) - - //rods - O = new /obj/item/stack/rods(src.loc) - step_to(O, get_turf(pick(view(7, src)))) - if(prob(75)) - O = new /obj/item/stack/rods(src.loc) - step_to(O, get_turf(pick(view(7, src)))) - if(prob(50)) - O = new /obj/item/stack/rods(src.loc) - step_to(O, get_turf(pick(view(7, src)))) - if(prob(25)) - O = new /obj/item/stack/rods(src.loc) - step_to(O, get_turf(pick(view(7, src)))) - - //plasteel - O = new /obj/item/stack/material/plasteel(src.loc) - step_to(O, get_turf(pick(view(7, src)))) - if(prob(75)) - O = new /obj/item/stack/material/plasteel(src.loc) - step_to(O, get_turf(pick(view(7, src)))) - if(prob(50)) - O = new /obj/item/stack/material/plasteel(src.loc) - step_to(O, get_turf(pick(view(7, src)))) - if(prob(25)) - O = new /obj/item/stack/material/plasteel(src.loc) - step_to(O, get_turf(pick(view(7, src)))) - - //also drop dummy circuit boards deconstructable for research (loot) - var/obj/item/weapon/circuitboard/C - - //spawn 1-4 boards of a random type - var/spawnees = 0 - var/num_boards = rand(1,4) - var/list/options = list(1,2,4,8,16,32,64,128,256,512) - for(var/i=0, i\the [src] knocks down \the [L]!") - -/mob/living/simple_mob/hostile/faithless/cult - faction = "cult" - supernatural = 1 - -/mob/living/simple_mob/hostile/faithless/cult/cultify() - return - -/mob/living/simple_mob/hostile/faithless/cult/Life() - ..() - check_horde() - -/mob/living/simple_mob/hostile/faithless/strong - maxHealth = 100 - health = 100 - - harm_intent_damage = 5 - melee_damage_lower = 13 - melee_damage_upper = 28 - -/mob/living/simple_mob/hostile/faithless/strong/cult - faction = "cult" - supernatural = 1 - -/mob/living/simple_mob/hostile/faithless/cult/cultify() - return - -/mob/living/simple_mob/hostile/faithless/cult/Life() - ..() - check_horde() \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/aliens/hivebot.dm b/code/modules/mob/living/simple_animal/aliens/hivebot.dm deleted file mode 100644 index fbb0b8909b7..00000000000 --- a/code/modules/mob/living/simple_animal/aliens/hivebot.dm +++ /dev/null @@ -1,242 +0,0 @@ -// Hivebots are tuned towards how many default lasers are needed to kill them. -// As such, if laser damage is ever changed, you should change this define. -#define LASERS_TO_KILL * 40 - -// Default hivebot is melee, and a bit more meaty, so it can meatshield for their ranged friends. -/mob/living/simple_mob/hostile/hivebot - name = "hivebot" - desc = "A robot. It appears to be somewhat resilient, but lacks a true weapon." - icon = 'icons/mob/hivebot.dmi' - icon_state = "basic" - icon_living = "basic" - icon_dead = "basic" - - faction = "hivebot" - intelligence_level = SA_ROBOTIC - maxHealth = 3 LASERS_TO_KILL - health = 3 LASERS_TO_KILL - speed = 4 - - melee_damage_lower = 15 - melee_damage_upper = 15 - - attacktext = list("clawed") - projectilesound = 'sound/weapons/Gunshot.ogg' - projectiletype = /obj/item/projectile/bullet/hivebot - - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - minbodytemp = 0 - - cooperative = TRUE - firing_lines = TRUE - investigates = TRUE - run_at_them = FALSE //VOREStation Edit - - speak_chance = 1 - speak = list( - "Resuming task: Protect area.", - "No threats found.", - "Error: No targets found." - ) - emote_hear = list("hums ominously", "whirrs softly", "grinds a gear") - emote_see = list("looks around the area", "turns from side to side") - say_understood = list("Affirmative.", "Positive.") - say_cannot = list("Denied.", "Negative.") - say_maybe_target = list("Possible threat detected. Investigating.", "Motion detected.", "Investigating.") - say_got_target = list("Threat detected.", "New task: Remove threat.", "Threat removal engaged.", "Engaging target.") - -/mob/living/simple_mob/hostile/hivebot/isSynthetic() - return TRUE - -// Subtypes. - -// Melee like the base type, but more fragile. -/mob/living/simple_mob/hostile/hivebot/swarm - name = "swarm hivebot" - desc = "A robot. It looks fragile and weak" - maxHealth = 1 LASERS_TO_KILL - health = 1 LASERS_TO_KILL - melee_damage_lower = 8 - melee_damage_upper = 8 - -// This one has a semi-weak ranged attack. -/mob/living/simple_mob/hostile/hivebot/range - name = "ranged hivebot" - desc = "A robot. It has a simple ballistic weapon." - ranged = 1 - maxHealth = 2 LASERS_TO_KILL - health = 2 LASERS_TO_KILL - -// This one shoots a burst of three, and is considerably more dangerous. -/mob/living/simple_mob/hostile/hivebot/range/rapid - name = "rapid hivebot" - desc = "A robot. It has a fast firing ballistic rifle." - icon_living = "strong" - rapid = 1 - maxHealth = 2 LASERS_TO_KILL - health = 2 LASERS_TO_KILL - -// Shoots EMPs, to screw over other robots. -/mob/living/simple_mob/hostile/hivebot/range/ion - name = "engineering hivebot" - desc = "A robot. It has a tool which emits focused electromagnetic pulses, which are deadly to synthetic adverseries." - projectiletype = /obj/item/projectile/ion/pistol //VOREStation Edit - projectilesound = 'sound/weapons/Laser.ogg' - icon_living = "engi" - ranged = TRUE - maxHealth = 2 LASERS_TO_KILL - health = 2 LASERS_TO_KILL - -// Shoots deadly lasers. -/mob/living/simple_mob/hostile/hivebot/range/laser - name = "laser hivebot" - desc = "A robot. It has an energy weapon." - projectiletype = /obj/item/projectile/beam/blue - projectilesound = 'sound/weapons/Laser.ogg' - maxHealth = 2 LASERS_TO_KILL - health = 2 LASERS_TO_KILL - -// Beefy and ranged. -/mob/living/simple_mob/hostile/hivebot/range/strong - name = "strong hivebot" - desc = "A robot. This one has reinforced plating, and looks tougher." - icon_living = "strong" - maxHealth = 4 LASERS_TO_KILL - health = 4 LASERS_TO_KILL - melee_damage_lower = 15 - melee_damage_upper = 15 - -// Also beefy, but tries to stay at their 'home', ideal for base defense. -/mob/living/simple_mob/hostile/hivebot/range/guard - name = "guard hivebot" - desc = "A robot. It seems to be guarding something." - returns_home = TRUE - maxHealth = 4 LASERS_TO_KILL - health = 4 LASERS_TO_KILL - -// This one is intended for players to use. Well rounded and can make other hivebots follow them with verbs. -/mob/living/simple_mob/hostile/hivebot/range/player - name = "commander hivebot" - desc = "A robot. This one seems to direct the others, and it has a laser weapon." - icon_living = "commander" - maxHealth = 5 LASERS_TO_KILL - health = 5 LASERS_TO_KILL - projectiletype = /obj/item/projectile/beam/blue - projectilesound = 'sound/weapons/Laser.ogg' - melee_damage_lower = 15 // Needed to force open airlocks. - melee_damage_upper = 15 - -// Procs. - -/mob/living/simple_mob/hostile/hivebot/death() - ..() - visible_message("[src] blows apart!") - new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(3, 1, src) - s.start() - qdel(src) - -/mob/living/simple_mob/hostile/hivebot/speech_bubble_appearance() - return "synthetic_evil" - -/mob/living/simple_mob/hostile/hivebot/verb/command_follow() - set name = "Command - Follow" - set category = "Hivebot" - set desc = "This will ask other hivebots to follow you." - - say("Delegating new task: Follow.") - - for(var/mob/living/simple_mob/hostile/hivebot/buddy in hearers(src)) - if(buddy.faction != faction) - continue - if(buddy == src) - continue - buddy.set_follow(src) - buddy.FollowTarget() - spawn(rand(5, 10)) - buddy.say( pick(buddy.say_understood) ) - -/mob/living/simple_mob/hostile/hivebot/verb/command_stop() - set name = "Command - Stop Following" - set category = "Hivebot" - set desc = "This will ask other hivebots to cease following you." - - say("Delegating new task: Stop following.") - - for(var/mob/living/simple_mob/hostile/hivebot/buddy in hearers(src)) - if(buddy.faction != faction) - continue - if(buddy == src) - continue - buddy.LoseFollow() - spawn(rand(5, 10)) - buddy.say( pick(buddy.say_understood) ) - -/mob/living/simple_mob/hostile/hivebot/tele//this still needs work - name = "Beacon" - desc = "Some odd beacon thing" - icon = 'icons/mob/hivebot.dmi' - icon_state = "def_radar-off" - icon_living = "def_radar-off" - - health = 200 - maxHealth = 200 - status_flags = 0 - - anchored = 1 - wander = 0 - stop_automated_movement = 1 - - var/bot_type = "norm" - var/bot_amt = 10 - var/spawn_delay = 600 - var/turn_on = 0 - var/auto_spawn = 1 - proc - warpbots() - - - New() - ..() - var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread() - smoke.set_up(5, 0, src.loc) - smoke.start() - visible_message("The [src] warps in!") - playsound(src.loc, 'sound/effects/EMPulse.ogg', 25, 1) - - warpbots() - icon_state = "def_radar" - visible_message("The [src] turns on!") - while(bot_amt > 0) - bot_amt-- - switch(bot_type) - if("norm") - new /mob/living/simple_mob/hostile/hivebot(get_turf(src)) - if("range") - new /mob/living/simple_mob/hostile/hivebot/range(get_turf(src)) - if("rapid") - new /mob/living/simple_mob/hostile/hivebot/range/rapid(get_turf(src)) - spawn(100) - qdel(src) - return - - - Life() - ..() - if(stat == 0) - if(prob(2))//Might be a bit low, will mess with it likely - warpbots() - -/obj/item/projectile/bullet/hivebot - damage = 10 - damage_type = BRUTE - -#undef LASERS_TO_KILL \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/aliens/mimic.dm b/code/modules/mob/living/simple_animal/aliens/mimic.dm deleted file mode 100644 index da254315be1..00000000000 --- a/code/modules/mob/living/simple_animal/aliens/mimic.dm +++ /dev/null @@ -1,207 +0,0 @@ -// -// Abstract Class -// - -/mob/living/simple_mob/hostile/mimic - name = "crate" - desc = "A rectangular steel crate." - icon = 'icons/obj/storage.dmi' - icon_state = "crate" - icon_living = "crate" - - faction = "mimic" - intelligence_level = SA_ANIMAL - - maxHealth = 250 - health = 250 - speed = 4 - move_to_delay = 8 - - response_help = "touches" - response_disarm = "pushes" - response_harm = "hits" - - harm_intent_damage = 5 - melee_damage_lower = 8 - melee_damage_upper = 12 - attacktext = list("attacked") - attack_sound = 'sound/weapons/bite.ogg' - - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - minbodytemp = 0 - - meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat - - showvoreprefs = 0 //VOREStation Edit - Hides mechanical vore prefs for mimics. You can't see their gaping maws when they're just sitting idle. - -/mob/living/simple_mob/hostile/mimic/set_target() - . = ..() - if(.) - audible_emote("growls at [.]") - -/mob/living/simple_mob/hostile/mimic/death() - ..() - qdel(src) - -/mob/living/simple_mob/hostile/mimic/will_show_tooltip() - return FALSE - - -// -// Crate Mimic -// - -// Aggro when you try to open them. Will also pickup loot when spawns and drop it when dies. -/mob/living/simple_mob/hostile/mimic/crate - - attacktext = list("bitten") - - stop_automated_movement = 1 - wander = 0 - var/attempt_open = 0 - -// Pickup loot -/mob/living/simple_animal/hostile/mimic/crate/Initialize() - . = ..() - for(var/obj/item/I in loc) - I.forceMove(src) - -/mob/living/simple_mob/hostile/mimic/crate/DestroySurroundings() - ..() - if(prob(90)) - icon_state = "[initial(icon_state)]open" - else - icon_state = initial(icon_state) - -/mob/living/simple_mob/hostile/mimic/crate/ListTargets() - if(attempt_open) - return ..() - else - return ..(1) - -/mob/living/simple_mob/hostile/mimic/crate/set_target() - . = ..() - if(.) - trigger() - -/mob/living/simple_mob/hostile/mimic/crate/PunchTarget() - . = ..() - if(.) - icon_state = initial(icon_state) - -/mob/living/simple_mob/hostile/mimic/crate/proc/trigger() - if(!attempt_open) - visible_message("[src] starts to move!") - attempt_open = 1 - -/mob/living/simple_mob/hostile/mimic/crate/adjustBruteLoss(var/damage) - trigger() - ..(damage) - -/mob/living/simple_mob/hostile/mimic/crate/LoseTarget() - ..() - icon_state = initial(icon_state) - -/mob/living/simple_mob/hostile/mimic/crate/LostTarget() - ..() - icon_state = initial(icon_state) - -/mob/living/simple_mob/hostile/mimic/crate/death() - var/obj/structure/closet/crate/C = new(get_turf(src)) - // Put loot in crate - for(var/obj/O in src) - if(isbelly(O)) //VOREStation edit - continue - O.forceMove(C) - ..() - -/mob/living/simple_mob/hostile/mimic/crate/PunchTarget() - . =..() - var/mob/living/L = . - if(istype(L)) - if(prob(15)) - L.Weaken(2) - L.visible_message("\the [src] knocks down \the [L]!") - -// -// Copy Mimic -// - -var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/cable, /obj/structure/window, /obj/item/projectile/animate) - -/mob/living/simple_mob/hostile/mimic/copy - - health = 100 - maxHealth = 100 - var/mob/living/creator = null // the creator - var/destroy_objects = 0 - var/knockdown_people = 0 - -/mob/living/simple_mob/hostile/mimic/copy/New(loc, var/obj/copy, var/mob/living/creator) - ..(loc) - CopyObject(copy, creator) - -/mob/living/simple_mob/hostile/mimic/copy/death() - - for(var/atom/movable/M in src) - if(isbelly(M)) //VOREStation edit - continue - M.forceMove(get_turf(src)) - ..() - -/mob/living/simple_mob/hostile/mimic/copy/ListTargets() - // Return a list of targets that isn't the creator - . = ..() - return . - creator - -/mob/living/simple_mob/hostile/mimic/copy/proc/CopyObject(var/obj/O, var/mob/living/creator) - - if((istype(O, /obj/item) || istype(O, /obj/structure)) && !is_type_in_list(O, protected_objects)) - - O.forceMove(src) - name = O.name - desc = O.desc - icon = O.icon - icon_state = O.icon_state - icon_living = icon_state - - if(istype(O, /obj/structure)) - health = (anchored * 50) + 50 - destroy_objects = 1 - if(O.density && O.anchored) - knockdown_people = 1 - melee_damage_lower *= 2 - melee_damage_upper *= 2 - else if(istype(O, /obj/item)) - var/obj/item/I = O - health = 15 * I.w_class - melee_damage_lower = 2 + I.force - melee_damage_upper = 2 + I.force - move_to_delay = 2 * I.w_class - - maxHealth = health - if(creator) - src.creator = creator - faction = "\ref[creator]" // very unique - return 1 - return - -/mob/living/simple_mob/hostile/mimic/copy/DestroySurroundings() - if(destroy_objects) - ..() - -/mob/living/simple_mob/hostile/mimic/copy/PunchTarget() - . =..() - if(knockdown_people) - var/mob/living/L = . - if(istype(L)) - if(prob(15)) - L.Weaken(1) - L.visible_message("\the [src] knocks down \the [L]!") diff --git a/code/modules/mob/living/simple_animal/aliens/shade.dm b/code/modules/mob/living/simple_animal/aliens/shade.dm deleted file mode 100644 index 000061f0f82..00000000000 --- a/code/modules/mob/living/simple_animal/aliens/shade.dm +++ /dev/null @@ -1,61 +0,0 @@ -/mob/living/simple_mob/shade - name = "Shade" - real_name = "Shade" - desc = "A bound spirit" - icon = 'icons/mob/mob.dmi' - icon_state = "shade" - icon_living = "shade" - icon_dead = "shade_dead" - - faction = "cult" - intelligence_level = SA_HUMANOID - - maxHealth = 50 - health = 50 - speed = -1 - - response_help = "puts their hand through" - response_disarm = "flails at" - response_harm = "punches" - - melee_damage_lower = 5 - melee_damage_upper = 15 - attack_armor_pen = 100 //It's a ghost/horror from beyond, I ain't gotta explain 100 AP - attacktext = list("drained the life from") - - minbodytemp = 0 - maxbodytemp = 4000 - min_oxy = 0 - max_co2 = 0 - max_tox = 0 - - stop_automated_movement = 1 - wander = 0 - status_flags = 0 - - speak_chance = 5 - universal_speak = 1 - speak_emote = list("hisses") - emote_hear = list("wails","screeches") - - loot_list = list(/obj/item/weapon/ectoplasm = 100) - -/mob/living/simple_mob/shade/cultify() - return - -/mob/living/simple_mob/shade/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(istype(O, /obj/item/device/soulstone)) - var/obj/item/device/soulstone/S = O; - S.transfer_soul("SHADE", src, user) - return - ..() - -/mob/living/simple_mob/shade/death() - ..() - for(var/mob/M in viewers(src, null)) - if((M.client && !( M.blinded ))) - M.show_message("[src] lets out a contented sigh as their form unwinds.") - - ghostize() - qdel(src) - return diff --git a/code/modules/mob/living/simple_animal/aliens/statue.dm b/code/modules/mob/living/simple_animal/aliens/statue.dm deleted file mode 100644 index 0dc3a448682..00000000000 --- a/code/modules/mob/living/simple_animal/aliens/statue.dm +++ /dev/null @@ -1,457 +0,0 @@ -// A mob which only moves when it isn't being watched by living beings. -//Weeping angels/SCP-173 hype -//Horrible shitcoding and stolen code adaptations below. You have been warned. - -/mob/living/simple_mob/hostile/statue - name = "statue" // matches the name of the statue with the flesh-to-stone spell - desc = "An incredibly lifelike marble carving. Its eyes seems to follow you..." // same as an ordinary statue with the added "eye following you" description - icon = 'icons/obj/statue.dmi' - tt_desc = "angelum weepicus" - icon_state = "human_male" - icon_living = "human_male" - icon_dead = "human_male" - intelligence_level = SA_HUMANOID - stop_automated_movement = 1 - var/annoyance = 30 //stop staring you creep - var/respond = 1 - var/banishable = 0 - faction = "statue" - mob_size = MOB_HUGE - response_help = "touches" - response_disarm = "pushes" - environment_smash = 2 - can_be_antagged = 1 - speed = -1 - maxHealth = 3000 - health = 3000 - status_flags = CANPUSH -// investigates = 1 - a_intent = I_HURT - density = 1 - mob_bump_flag = HEAVY - mob_push_flags = ~HEAVY - mob_swap_flags = ~HEAVY - harm_intent_damage = 60 - melee_damage_lower = 50 - melee_damage_upper = 70 - attacktext = "clawed" - attack_sound = 'sound/hallucinations/growl1.ogg' - - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - minbodytemp = 0 - maxbodytemp = 9000 - run_at_them = 0 - - move_to_delay = 0 // Very fast - - animate_movement = NO_STEPS // Do not animate movement, you jump around as you're a scary statue. - - see_in_dark = 13 - view_range = 35 //So it can run at the victim when out of the view - - melee_miss_chance = 0 - - armor = list( - "melee" = 30, - "bullet" = 60, - "laser" = 80, - "energy" = 30, - "bomb" = 30, - "bio" = 100, - "rad" = 100) - - resistance = 20 - - see_invisible = SEE_INVISIBLE_NOLIGHTING - sight = SEE_SELF|SEE_MOBS|SEE_OBJS|SEE_TURFS - var/last_hit = 0 - var/cannot_be_seen = 1 - var/mob/living/creator = null - var/drilled = FALSE - - -// No movement while seen code. - -/mob/living/simple_mob/hostile/statue/New(loc) - ..() - // Give spells - add_spell(new/spell/aoe_turf/flicker_lights) - add_spell(new/spell/aoe_turf/blindness) - add_spell(new/spell/aoe_turf/shatter) - -/mob/living/simple_mob/hostile/statue/DestroySurroundings() - if(can_be_seen(get_turf(loc))) - if(client) - to_chat(src, "You cannot move, there are eyes on you!") - return 0 - return ..() - -/mob/living/simple_mob/hostile/statue/attackby(var/obj/item/O as obj, var/mob/user as mob) //banishing the statue is a risky job - if(istype(O, /obj/item/weapon/nullrod)) - visible_message("[user] tries to banish [src] with [O]!") - if(do_after(user, 15, src)) - if(banishable) - visible_message("[src] crumbles into dust!") - gib() - else - visible_message("[src] is too strong to be banished!") - Paralyse(rand(8,15)) - if(istype(O, /obj/item/weapon/pickaxe) || istype(O, /obj/item/weapon/pickaxe/plasmacutter) && !drilled) - drilled = TRUE - resistance = 0 - spawn(300) - drilled = FALSE - resistance = initial(resistance) - ..() - -/mob/living/simple_mob/hostile/statue/death() - var/chunks_to_spawn = rand(2,5) - for(var/I = 1 to chunks_to_spawn) - new /obj/item/stack/material/marble(get_turf(loc)) - new /obj/item/cursed_marble(get_turf(loc)) - ..() - -/mob/living/simple_mob/hostile/statue/Move(turf/NewLoc) - if(can_be_seen(NewLoc)) - if(client) - to_chat(src, "You cannot move, there are eyes on you!") - return 0 - return ..() - -/mob/living/simple_mob/hostile/statue/Life() - ..() - handle_target() - handleAnnoyance() - if(target_mob) //if there's a victim, statue will use its powers - if((annoyance + 4) < 800) - annoyance += 4 - if(drilled && (annoyance + 4) < 800) //Being hit with a drill makes them weaker, and angrier. - annoyance += 4 - else if ((annoyance - 2) > 0) - annoyance -= 2 - -/mob/living/simple_mob/hostile/statue/proc/handle_target() - if(target_mob) // If we have a target and we're AI controlled - var/mob/watching = can_be_seen() - // If they're not our target - if(watching && (watching != target_mob)) - // This one is closer. - if(get_dist(watching, src) > get_dist(target_mob, src)) - LoseTarget() - target_mob = watching - - -/mob/living/simple_mob/hostile/statue/proc/handleAnnoyance() - if(respond) //so it won't blind people 24/7 - respond = 0 - if (annoyance > 30) - AI_blind() - annoyance -= 30 - if (prob(30) && annoyance > 30) - var/turf/T = get_turf(loc) - if(T.get_lumcount() * 10 > 1.5) - AI_flash() - annoyance -= 30 - spawn(20) - respond = 1 - - -/mob/living/simple_mob/hostile/statue/proc/AI_blind() - for(var/mob/living/L in oviewers(12, src)) //the range is so big, because it tries to keep out of sight and can't reengage if you get too far - if (prob(70)) - if(ishuman(L)) - var/mob/living/carbon/human/H = L - if (H.species == "Diona" || H.species == "Promethean" || H == creator)// can't blink and organic - return - to_chat(L, pick("Your eyes feel very heavy.", "You blink suddenly!", "Your eyes close involuntarily!")) - L.Blind(2) - return - -/mob/living/simple_mob/hostile/statue/proc/AI_flash() - if (prob(60)) - visible_message("The statue slowly points at the light.") - for(var/obj/machinery/light/L in oview(12, src)) - L.flicker() - return - - -/mob/living/simple_mob/hostile/statue/proc/AI_mirrorshmash() - for(var/obj/structure/mirror/M in oview(4, src)) - if ((!M.shattered )||(!M.glass)) - visible_message("The statue slowly points at the mirror!") - sleep(5) - M.shatter() - return - - - -/mob/living/simple_mob/hostile/statue/AttackTarget() - if(can_be_seen(get_turf(loc))) - if(client) - to_chat(src, "You cannot attack, there are eyes on you!") - return - else - spawn(3) //a small delay - ..() - - - -/mob/living/simple_mob/hostile/statue/DoPunch(var/atom/A) //had to redo that, since it's supposed to target only head and upper body - if(!Adjacent(A)) // They could've moved in the meantime. - return FALSE - - var/damage_to_do = rand(melee_damage_lower, melee_damage_upper) - - for(var/datum/modifier/M in modifiers) - if(!isnull(M.outgoing_melee_damage_percent)) - damage_to_do *= M.outgoing_melee_damage_percent - - // SA attacks can be blocked with shields. - if(ishuman(A)) - var/mob/living/carbon/human/H = A - H.adjustBruteLossByPart(damage_to_do*0.9, pick(BP_HEAD, BP_TORSO)) - playsound(src, attack_sound, 75, 1) - - else if(A.attack_generic(src, damage_to_do, pick(attacktext), attack_armor_type, attack_armor_pen, attack_sharp, attack_edge) && attack_sound) - playsound(src, attack_sound, 75, 1) - - return TRUE - - - - - -/mob/living/simple_mob/hostile/statue/face_atom() - if(!can_be_seen(get_turf(loc))) - ..() - -/mob/living/simple_mob/hostile/statue/proc/can_be_seen(turf/destination) - if(!cannot_be_seen) - return null - - var/turf/T = get_turf(loc) -/* if(T && destination && T.lighting_overlay) - if(T.get_lumcount() * 10 < 0.9 && destination.get_lumcount() * 10 < 0.9) // No one can see us in the darkness, right? - return null - if(T == destination) - destination = null*/ - - // loop for viewers. - var/list/check_list = list(src) - if(destination) - check_list += destination -//&& (M.see_in_dark > 5) - // This loop will, at most, loop twice. - for(var/atom/check in check_list) - for(var/mob/living/M in viewers(world.view + 1, check) - src) - if(M != creator) - if(!(M.sdisabilities & BLIND) || !(M.blinded)) //if not blinded - if(M.has_vision() && !M.isSynthetic()) //is able to see the statue - if(T && destination && T.lighting_overlay) // Check for darkness - if(T.get_lumcount() * 10 < 0.9 && destination.get_lumcount() * 10 < 0.9) // No one can see us in the darkness, right? WRONG! Damn cats. - if(M.see_in_dark > 5) - return M - return null - return M - for(var/obj/mecha/M in view(world.view + 1, check)) //assuming if you can see them they can see you - if(M.occupant && M.occupant.client && M.occupant != creator) - if(M.occupant.has_vision() && !M.occupant.isSynthetic()) - return M.occupant - for(var/obj/structure/mirror/M in view(3, check)) //Weeping angels hate mirrors. Probably because they're ugly af - if ((!M.shattered )||(!M.glass)) - annoyance += 3 - if (prob(5) && (ai_inactive == 0)) - AI_mirrorshmash() - annoyance -= 50 - return src //if it sees the mirror, it sees itself, right? - return null - -// Cannot talk - -/mob/living/simple_mob/hostile/statue/say() - return 0 - -// Turn to dust when gibbed - -/mob/living/simple_mob/hostile/statue/gib() - dust() - - -// Stop attacking clientless mobs - -/mob/living/simple_mob/hostile/statue/proc/CanAttack(atom/the_target) //ignore clientless mobs - if(isliving(the_target)) - var/mob/living/L = the_target - if(!L.client && !L.ckey) - return 0 - return ..() - -// Statue powers - -// Flicker lights -/spell/aoe_turf/flicker_lights - name = "Flicker Lights" - desc = "You will trigger a large amount of lights around you to flicker." - spell_flags = 0 - charge_max = 400 - range = 10 - -/spell/aoe_turf/flicker_lights/cast(list/targets, mob/user = usr) - for(var/turf/T in targets) - for(var/obj/machinery/light/L in T) - L.flicker() - return - -//Blind AOE -/spell/aoe_turf/blindness - name = "Blindness" - desc = "Your prey will be momentarily blind for you to advance on them." - - message = "You glare your eyes." - charge_max = 250 - spell_flags = 0 - range = 10 - -/spell/aoe_turf/blindness/cast(list/targets, mob/living/simple_mob/hostile/statue/user = usr) - for(var/mob/living/L in targets) - if(L == user || L == user.creator) - continue - var/turf/T = get_turf(L.loc) - if(T && T in targets) - L.Blind(4) - return - - -/spell/aoe_turf/shatter - name = "Shatter mirrors!" - desc = "That handsome devil has to wait. You have people to make into corpses." - - message = "You glare your eyes." - charge_max = 300 - spell_flags = 0 - range = 8 - - - - -/spell/aoe_turf/shatter/cast(list/targets, mob/user = usr) - spawn(50) - for(var/obj/structure/mirror/M in view(5, src)) - if ((!M.shattered )||(!M.glass)) - M.shatter() - return - - - -/mob/living/simple_mob/hostile/statue/verb/toggle_darkness() - set name = "Toggle Darkness" - set desc = "You ARE the darkness." - set category = "Abilities" - seedarkness = !seedarkness - plane_holder.set_vis(VIS_FULLBRIGHT, !seedarkness) - to_chat(src,"You [seedarkness ? "now" : "no longer"] see darkness.") - - - -/mob/living/simple_mob/hostile/statue/restrained() - . = ..() - if(can_be_seen(loc)) - return 1 - - -/mob/living/simple_mob/hostile/statue/ListTargets(dist = view_range) - var/list/L = mobs_in_xray_view(dist, src) - - for(var/obj/mecha/M in mechas_list) - if ((M.z == src.z) && (get_dist(src, M) <= dist) && (isInSight(src,M))) - L += M - if(creator) - L -= creator - - return L - - - -/obj/item/cursed_marble //slime cube copypaste - name = "marble slab" - desc = "A peculiar slab of marble, radiating with dark energy." - icon = 'icons/obj/stacks.dmi' - icon_state = "sheet-marble" - description_info = "Summons the Statue - a mysterious powerful creature, that can move only when unsurveyed by living eyes." - var/searching = 0 - -/obj/item/cursed_marble/attack_self(mob/user as mob) - if(!searching) - to_chat(user, "You rub the slab in hopes a wandering spirit wishes to inhabit it. [src] starts to sparkle!") - icon_state = "sheet-snowbrick" - searching = 1 - request_player(user) - spawn(60 SECONDS) - reset_search() - - -/obj/item/cursed_marble/proc/request_player(var/mob/user) - for(var/mob/observer/dead/O in player_list) - if(!O.MayRespawn()) - continue - if(O.client) - if(O.client.prefs.be_special & BE_ALIEN) - question(O.client, user) - -/obj/item/cursed_marble/proc/question(var/client/C, var/mob/user) - spawn(0) - if(!C) - return - var/response = alert(C, "Someone is requesting a soul for the statue. Would you like to play as one?", "Statue request", "Yes", "No", "Never for this round") - if(response == "Yes") - response = alert(C, "Are you sure you want to play as the statue?", "Statue request", "Yes", "No") - if(!C || 2 == searching) - return //handle logouts that happen whilst the alert is waiting for a response, and responses issued after a brain has been located. - if(response == "Yes") - transfer_personality(C.mob, user) - else if(response == "Never for this round") - C.prefs.be_special ^= BE_ALIEN - -/obj/item/cursed_marble/proc/reset_search() //We give the players sixty seconds to decide, then reset the timer. - icon_state = "sheet-marble" - if(searching == 1) - searching = 0 - var/turf/T = get_turf_or_move(src.loc) - for (var/mob/M in viewers(T)) - M.show_message("[src] fades. Maybe it will spark another time.") - -/obj/item/cursed_marble/proc/transfer_personality(var/mob/candidate, var/mob/user) - announce_ghost_joinleave(candidate, 0, "They are a statue now.") - src.searching = 2 - var/mob/living/simple_mob/hostile/statue/S = new(get_turf(src)) - S.client = candidate.client - if(user) - S.creator = user - to_chat(S, "You are \a [S], brought into existence on [station_name()] by [user]! Obey all their orders.") - S.mind.assigned_role = "The Statue" - visible_message("The slab suddenly takes the shape of a humanoid!") - qdel(src) - - -/obj/item/cursed_marble/verb/crush() //if there's no ghosts to respond to your request/you want to use the statue for malicious stuff - set name = "Crush the marble slab" - set category = "Object" - set src in usr - summonmob(usr) - -/obj/item/cursed_marble/proc/summonmob(mob/user as mob) - if(searching == 0) - var/choice = alert(user, "Are you sure you want to crush the marble? (this will spawn a clientless version of the statue, hostile to everyone, but you)", "Crush it?", "Yes", "No") - if(choice) - if(choice == "Yes") - var/mob/living/simple_mob/hostile/statue/S = new /mob/living/simple_mob/hostile/statue(get_turf(user)) - visible_message("The slab suddenly takes the shape of a humanoid!") - S.creator = user - qdel(src) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/animals/bat.dm b/code/modules/mob/living/simple_animal/animals/bat.dm deleted file mode 100644 index 31588143531..00000000000 --- a/code/modules/mob/living/simple_animal/animals/bat.dm +++ /dev/null @@ -1,85 +0,0 @@ -/mob/living/simple_mob/hostile/scarybat - name = "space bats" - desc = "A swarm of cute little blood sucking bats that looks pretty upset." - tt_desc = "N Bestia gregaria" //Nispean swarm bats, because of course Nisp has swarm bats - icon = 'icons/mob/bats.dmi' - icon_state = "bat" - icon_living = "bat" - icon_dead = "bat_dead" - icon_gib = "bat_dead" - - faction = "scarybat" - intelligence_level = SA_ANIMAL - - maxHealth = 20 - health = 20 - turns_per_move = 3 - speed = 4 - - response_help = "pets the" - response_disarm = "gently pushes aside the" - response_harm = "hits the" - - harm_intent_damage = 10 - - melee_damage_lower = 5 - melee_damage_upper = 5 - attack_sharp = 1 - - environment_smash = 1 - - attacktext = list("bites") - attack_sound = 'sound/weapons/bite.ogg' - - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - minbodytemp = 0 - - has_langs = list("Mouse") - - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat - - var/mob/living/owner - -/mob/living/simple_mob/hostile/scarybat/New(loc, mob/living/L as mob) - ..() - if(istype(L)) - owner = L - -/mob/living/simple_mob/hostile/scarybat/Process_Spacemove(var/check_drift = 0) - return ..() - -/mob/living/simple_mob/hostile/scarybat/set_target() - . = ..() - if(.) - emote("flutters towards [.]") - -/mob/living/simple_mob/hostile/scarybat/ListTargets() - . = ..() - if(owner) - return . - owner - -/mob/living/simple_mob/hostile/scarybat/PunchTarget() - . =..() - var/mob/living/L = . - if(istype(L)) - if(prob(15)) - L.Stun(1) - L.visible_message("\the [src] scares \the [L]!") - -/mob/living/simple_mob/hostile/scarybat/cult - faction = "cult" - supernatural = 1 - -/mob/living/simple_mob/hostile/scarybat/cult/cultify() - return - -/mob/living/simple_mob/hostile/scarybat/cult/Life() - ..() - check_horde() diff --git a/code/modules/mob/living/simple_animal/animals/bear.dm b/code/modules/mob/living/simple_animal/animals/bear.dm deleted file mode 100644 index dfd6a56cab6..00000000000 --- a/code/modules/mob/living/simple_animal/animals/bear.dm +++ /dev/null @@ -1,141 +0,0 @@ -//Space bears! -/mob/living/simple_mob/hostile/bear - name = "space bear" - desc = "A product of Space Russia?" - tt_desc = "U Ursinae aetherius" //...bearspace? Maybe. - icon_state = "bear" - icon_living = "bear" - icon_dead = "bear_dead" - icon_gib = "bear_gib" - - faction = "russian" - intelligence_level = SA_ANIMAL - cooperative = 1 - - maxHealth = 120 - health = 120 - turns_per_move = 5 - see_in_dark = 6 - stop_when_pulled = 0 - - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "pokes" - - melee_damage_lower = 20 - melee_damage_upper = 30 - attack_sharp = 1 - attack_edge = 1 - - //Space bears aren't affected by atmos. - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - minbodytemp = 0 - - speak_chance = 1 - speak = list("RAWR!","Rawr!","GRR!","Growl!") - speak_emote = list("growls", "roars") - emote_hear = list("rawrs","grumbles","grawls") - emote_see = list("stares ferociously", "stomps") - - meat_type = /obj/item/weapon/reagent_containers/food/snacks/bearmeat - -// var/stance_step = 0 - -/mob/living/simple_mob/hostile/bear/handle_stance(var/new_stance) - // Below was a bunch of code that made this specific mob be 'alert' and will hurt you when it gets closer. - // It's commented out because it made infinite loops and the AI is going to be moved/rewritten sometime soon (famous last words) - // and it would be better if this 'alert before attacking' behaviour was on the parent instead of a specific type of mob anyways. - - // Instead we're just gonna get angry if we're dying. - ..(new_stance) - if(stance == STANCE_ATTACK || stance == STANCE_ATTACKING) - if((health / maxHealth) <= 0.5) // At half health, and fighting someone currently. - add_modifier(/datum/modifier/berserk, 30 SECONDS) - - /* - switch(stance) - if(STANCE_TIRED) - stop_automated_movement = 1 - stance_step++ - if(stance_step >= 10) //rests for 10 ticks - if(target_mob && target_mob in ListTargets(10)) - handle_stance(STANCE_ATTACK) //If the mob he was chasing is still nearby, resume the attack, otherwise go idle. - else - handle_stance(STANCE_IDLE) - - if(STANCE_ALERT) - stop_automated_movement = 1 - var/found_mob = 0 - if(target_mob && target_mob in ListTargets(10)) - if(!(SA_attackable(target_mob))) - stance_step = max(0, stance_step) //If we have not seen a mob in a while, the stance_step will be negative, we need to reset it to 0 as soon as we see a mob again. - stance_step++ - found_mob = 1 - src.set_dir(get_dir(src,target_mob)) //Keep staring at the mob - - if(stance_step in list(1,4,7)) //every 3 ticks - var/action = pick( list( "growls at [target_mob]", "stares angrily at [target_mob]", "prepares to attack [target_mob]", "closely watches [target_mob]" ) ) - if(action) - custom_emote(1,action) - if(!found_mob) - stance_step-- - - if(stance_step <= -20) //If we have not found a mob for 20-ish ticks, revert to idle mode - handle_stance(STANCE_IDLE) - if(stance_step >= 7) //If we have been staring at a mob for 7 ticks, - handle_stance(STANCE_ATTACK) - - if(STANCE_ATTACKING) - if(stance_step >= 20) //attacks for 20 ticks, then it gets tired and needs to rest - custom_emote(1, "is worn out and needs to rest." ) - handle_stance(STANCE_TIRED) - stance_step = 0 - walk(src, 0) //This stops the bear's walking - return - else - ..() - */ - -/mob/living/simple_mob/hostile/bear/update_icons() - ..() - if(!stat) - if(loc && istype(loc,/turf/space)) - icon_state = "bear" - else - icon_state = "bearfloor" - -/mob/living/simple_mob/hostile/bear/Process_Spacemove(var/check_drift = 0) - return - -/mob/living/simple_mob/hostile/bear/FindTarget() - . = ..() - if(.) - custom_emote(1,"stares alertly at [.]") -// handle_stance(STANCE_ALERT) - -/mob/living/simple_mob/hostile/bear/PunchTarget() - if(!Adjacent(target_mob)) - return - custom_emote(1, pick( list("slashes at [target_mob]", "bites [target_mob]") ) ) - - var/damage = rand(melee_damage_lower, melee_damage_upper) - - if(ishuman(target_mob)) - var/mob/living/carbon/human/H = target_mob - var/dam_zone = pick(BP_TORSO, BP_L_HAND, BP_R_HAND, BP_L_LEG, BP_R_LEG) - var/obj/item/organ/external/affecting = H.get_organ(ran_zone(dam_zone)) - H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), H.get_armor_soak(affecting, "melee"), sharp=1, edge=1) - return H - else if(isliving(target_mob)) - var/mob/living/L = target_mob - L.adjustBruteLoss(damage) - return L - else - ..() diff --git a/code/modules/mob/living/simple_animal/animals/birds_vr.dm b/code/modules/mob/living/simple_animal/animals/birds_vr.dm deleted file mode 100644 index 0331e4931b7..00000000000 --- a/code/modules/mob/living/simple_animal/animals/birds_vr.dm +++ /dev/null @@ -1,151 +0,0 @@ -//Why are these a subclass of cat? -/mob/living/simple_mob/bird - name = "parrot" - desc = "A domesticated bird. Tweet tweet!" - icon = 'icons/mob/birds.dmi' - icon_state = "parrot-flap" - item_state = null - icon_living = "parrot-flap" - icon_dead = "parrot-dead" - - pass_flags = PASSTABLE - - speak_chance = 5 - speak = list("Chirp!","Caw!","Screech!","Squawk!") - speak_emote = list("chirps", "caws") - emote_hear = list("chirps","caws") - emote_see = list("shakes their head", "ruffles their feathers") - - holder_type = /obj/item/weapon/holder/bird - -/mob/living/simple_mob/bird/kea - name = "Kea" - icon_state = "kea-flap" - icon_living = "kea-flap" - icon_dead = "kea-dead" - -/mob/living/simple_mob/bird/eclectus - name = "Eclectus" - icon_state = "eclectus-flap" - icon_living = "eclectus-flap" - icon_dead = "eclectus-dead" - -/mob/living/simple_mob/bird/eclectusf - name = "Eclectus" - icon_state = "eclectusf-flap" - icon_living = "eclectusf-flap" - icon_dead = "eclectusf-dead" - -/mob/living/simple_mob/bird/greybird - name = "Grey Bird" - icon_state = "agrey-flap" - icon_living = "agrey-flap" - icon_dead = "agrey-dead" - -/mob/living/simple_mob/bird/blue_caique - name = "Blue Caique " - icon_state = "bcaique-flap" - icon_living = "bcaique-flap" - icon_dead = "bcaique-dead" - -/mob/living/simple_mob/bird/white_caique - name = "White caique" - icon_state = "wcaique-flap" - icon_living = "wcaique-flap" - icon_dead = "wcaique-dead" - -/mob/living/simple_mob/bird/green_budgerigar - name = "Green Budgerigar" - icon_state = "gbudge-flap" - icon_living = "gbudge-flap" - icon_dead = "gbudge-dead" - -/mob/living/simple_mob/bird/blue_Budgerigar - name = "Blue Budgerigar" - icon_state = "bbudge-flap" - icon_living = "bbudge-flap" - icon_dead = "bbudge-dead" - -/mob/living/simple_mob/bird/bluegreen_Budgerigar - name = "Bluegreen Budgerigar" - icon_state = "bgbudge-flap" - icon_living = "bgbudge-flap" - icon_dead = "bgbudge-dead" - -/mob/living/simple_mob/bird/commonblackbird - name = "Black Bird" - icon_state = "commonblackbird" - icon_living = "commonblackbird" - icon_dead = "commonblackbird-dead" - -/mob/living/simple_mob/bird/azuretit - name = "Azure Tit" - icon_state = "azuretit" - icon_living = "azuretit" - icon_dead = "azuretit-dead" - -/mob/living/simple_mob/bird/europeanrobin - name = "European Robin" - icon_state = "europeanrobin" - icon_living = "europeanrobin" - icon_dead = "europeanrobin-dead" - -/mob/living/simple_mob/bird/goldcrest - name = "Goldcrest" - icon_state = "goldcrest" - icon_living = "goldcrest" - icon_dead = "goldcrest-dead" - -/mob/living/simple_mob/bird/ringneckdove - name = "Ringneck Dove" - icon_state = "ringneckdove" - icon_living = "ringneckdove" - icon_dead = "ringneckdove-dead" - -/mob/living/simple_mob/bird/cockatiel - name = "Cockatiel" - icon_state = "tiel-flap" - icon_living = "tiel-flap" - icon_dead = "tiel-dead" - -/mob/living/simple_mob/bird/white_cockatiel - name = "White Cockatiel" - icon_state = "wtiel-flap" - icon_living = "wtiel-flap" - icon_dead = "wtiel-dead" - -/mob/living/simple_mob/bird/yellowish_cockatiel - name = "Yellowish Cockatiel" - icon_state = "luttiel-flap" - icon_living = "luttiel-flap" - icon_dead = "luttiel-dead" - -/mob/living/simple_mob/bird/grey_cockatiel - name = "Grey Cockatiel" - icon_state = "blutiel-flap" - icon_living = "blutiel-flap" - icon_dead = "blutiel-dead" - -/mob/living/simple_mob/bird/too - name = "Too" - icon_state = "too-flap" - icon_living = "too-flap" - icon_dead = "too-dead" - -/mob/living/simple_mob/bird/hooded_too - name = "Utoo" - icon_state = "utoo-flap" - icon_living = "utoo-flap" - icon_dead = "utoo-dead" - -/mob/living/simple_mob/bird/pink_too - name = "Mtoo" - icon_state = "mtoo-flap" - icon_living = "mtoo-flap" - icon_dead = "mtoo-dead" - -/obj/item/weapon/holder/bird - name = "Bird" - desc = "It's a bird!" - icon_state = null - item_icons = null diff --git a/code/modules/mob/living/simple_animal/animals/carp.dm b/code/modules/mob/living/simple_animal/animals/carp.dm deleted file mode 100644 index d5419c84628..00000000000 --- a/code/modules/mob/living/simple_animal/animals/carp.dm +++ /dev/null @@ -1,93 +0,0 @@ -/mob/living/simple_mob/hostile/carp - name = "space carp" - desc = "A ferocious, fang-bearing creature that resembles a fish." - tt_desc = "U Cyprinus aetherius" //carpspace? maybe - icon_state = "carp" - icon_living = "carp" - icon_dead = "carp_dead" - icon_gib = "carp_gib" - - faction = "carp" - intelligence_level = SA_ANIMAL - hovering = TRUE - maxHealth = 25 - health = 25 - speed = 4 - turns_per_move = 5 - - response_help = "pets the" - response_disarm = "gently pushes aside the" - response_harm = "hits the" - - harm_intent_damage = 8 - melee_damage_lower = 15 - melee_damage_upper = 15 - attacktext = list("bitten") - attack_sound = 'sound/weapons/bite.ogg' - - //Space carp aren't affected by atmos. - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - minbodytemp = 0 - - meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat - -/mob/living/simple_mob/hostile/carp/large - name = "elder carp" - desc = "An older, more matured carp. Few survive to this age due to their aggressiveness." - icon = 'icons/mob/64x32.dmi' - icon_state = "shark" - icon_living = "shark" - icon_dead = "shark_dead" - turns_per_move = 2 - move_to_delay = 2 - mob_size = MOB_LARGE - - pixel_x = -16 - old_x = -16 - - health = 50 - maxHealth = 50 - - -/mob/living/simple_mob/hostile/carp/large/huge - name = "great white carp" - desc = "A very rare breed of carp- and a very aggressive one." - icon = 'icons/mob/64x64.dmi' - icon_dead = "megacarp_dead" - icon_living = "megacarp" - icon_state = "megacarp" - maxHealth = 230 - health = 230 - attack_same = 1 - speed = 1 - - meat_amount = 10 - - melee_damage_lower = 15 - melee_damage_upper = 25 - old_y = -16 - pixel_y = -16 - -/mob/living/simple_mob/hostile/carp/Process_Spacemove(var/check_drift = 0) - return 1 //No drifting in space for space carp! //original comments do not steal - -/mob/living/simple_mob/hostile/carp/set_target() - . = ..() - if(.) - custom_emote(1,"nashes at [.]") - -/mob/living/simple_mob/hostile/carp/PunchTarget() - . =..() - var/mob/living/L = . - if(istype(L)) - if(prob(15)) - L.Weaken(3) - L.visible_message("\the [src] knocks down \the [L]!") - diff --git a/code/modules/mob/living/simple_animal/animals/cat_vr.dm b/code/modules/mob/living/simple_animal/animals/cat_vr.dm deleted file mode 100644 index d4be475cefa..00000000000 --- a/code/modules/mob/living/simple_animal/animals/cat_vr.dm +++ /dev/null @@ -1,66 +0,0 @@ -/mob/living/simple_mob/cat/fluff/Runtime/init_vore() - ..() - var/obj/belly/B = vore_selected - B.name = "Stomach" - B.desc = "The slimy wet insides of Runtime! Not quite as clean as the cat on the outside." - - B.emote_lists[DM_HOLD] = list( - "Runtime's stomach kneads gently on you and you're fairly sure you can hear her start purring.", - "Most of what you can hear are slick noises, Runtime breathing, and distant purring.", - "Runtime seems perfectly happy to have you in there. She lays down for a moment to groom and squishes you against the walls.", - "The CMO's pet seems to have found a patient of her own, and is treating them with warm, wet kneading walls.", - "Runtime mostly just lazes about, and you're left to simmer in the hot, slick guts unharmed.", - "Runtime's master might let you out of this fleshy prison, eventually. Maybe. Hopefully?") - - B.emote_lists[DM_DIGEST] = list( - "Runtime's stomach is treating you rather like a mouse, kneading acids into you with vigor.", - "A thick dollop of bellyslime drips from above while the CMO's pet's gut works on churning you up.", - "Runtime seems to have decided you're food, based on the acrid air in her guts and the pooling fluids.", - "Runtime's stomach tries to claim you, kneading and pressing inwards again and again against your form.", - "Runtime flops onto their side for a minute, spilling acids over your form as you remain trapped in them.", - "The CMO's pet doesn't seem to think you're any different from any other meal. At least, their stomach doesn't.") - - B.digest_messages_prey = list( - "Runtime's stomach slowly melts your body away. Her stomach refuses to give up it's onslaught, continuing until you're nothing more than nutrients for her body to absorb.", - "After an agonizing amount of time, Runtime's stomach finally manages to claim you, melting you down and adding you to her stomach.", - "Runtime's stomach continues to slowly work away at your body before tightly squeezing around you once more, causing the remainder of your body to lose form and melt away into the digesting slop around you.", - "Runtime's slimy gut continues to constantly squeeze and knead away at your body, the bulge you create inside of her stomach growing smaller as time progresses before soon dissapearing completely as you melt away.", - "Runtime's belly lets off a soft groan as your body finally gives out, the cat's eyes growing heavy as it settles down to enjoy it's good meal.", - "Runtime purrs happily as you slowly slip away inside of her gut, your body's nutrients are then used to put a layer of padding on the now pudgy cat.", - "The acids inside of Runtime's stomach, aided by the constant motions of the smooth walls surrounding you finally manage to melt you away into nothing more mush. She curls up on the floor, slowly kneading the air as her stomach moves its contents — including you — deeper into her digestive system.", - "Your form begins to slowly soften and break apart, rounding out Runtime's swollen belly. The carnivorous cat rumbles and purrs happily at the feeling of such a filling meal.") - -// Ascian's Tactical Kitten -/obj/item/weapon/holder/cat/fluff/tabiranth - name = "Spirit" - desc = "A small, inquisitive feline, who constantly seems to investigate his surroundings." - gender = MALE - icon_state = "kitten" - w_class = ITEMSIZE_SMALL - -/mob/living/simple_mob/cat/fluff/tabiranth - name = "Spirit" - desc = "A small, inquisitive feline, who constantly seems to investigate his surroundings." - icon = 'icons/mob/custom_items_mob.dmi' - icon_state = "kitten" - item_state = "kitten" - icon_living = "kitten" - icon_dead = "kitten" //Teleports out - gender = MALE - holder_type = /obj/item/weapon/holder/cat/fluff/tabiranth - var/friend_name = "Ascian" - digestable = 0 - meat_amount = 0 - maxHealth = 50 - health = 50 - -//Emergency teleport - Until a spriter makes something better -/mob/living/simple_mob/cat/fluff/tabiranth/death(gibbed, deathmessage = "teleports away!") - overlays = list() - icon_state = "" - flick("kphaseout",src) - spawn(1 SECOND) - qdel(src) //Back from whence you came! - - . = ..(FALSE, deathmessage) - diff --git a/code/modules/mob/living/simple_animal/animals/corgi.dm b/code/modules/mob/living/simple_animal/animals/corgi.dm deleted file mode 100644 index 52d2268be8d..00000000000 --- a/code/modules/mob/living/simple_animal/animals/corgi.dm +++ /dev/null @@ -1,231 +0,0 @@ -//Corgi -/mob/living/simple_mob/corgi - name = "corgi" - real_name = "corgi" - desc = "It's a corgi." - tt_desc = "E Canis lupus familiaris" - intelligence_level = SA_ANIMAL - icon_state = "corgi" - icon_living = "corgi" - icon_dead = "corgi_dead" - - run_at_them = 0 - turns_per_move = 10 - - response_help = "pets" - response_disarm = "bops" - response_harm = "kicks" - - see_in_dark = 5 - mob_size = 8 - - has_langs = list("Dog") - speak_chance = 1 - speak = list("YAP", "Woof!", "Bark!", "AUUUUUU") - speak_emote = list("barks", "woofs") - emote_hear = list("barks", "woofs", "yaps","pants") - emote_see = list("shakes its head", "shivers") - - meat_amount = 3 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/corgi - - var/obj/item/inventory_head - var/obj/item/inventory_back - -//IAN! SQUEEEEEEEEE~ -/mob/living/simple_mob/corgi/Ian - name = "Ian" - real_name = "Ian" //Intended to hold the name without altering it. - gender = MALE - desc = "It's a corgi." - var/turns_since_scan = 0 - var/obj/movement_target - response_help = "pets" - response_disarm = "bops" - response_harm = "kicks" - -/mob/living/simple_mob/corgi/Ian/Life() - ..() - - //Not replacing with SA FollowTarget mechanics because Ian behaves... very... specifically. - - //Feeding, chasing food, FOOOOODDDD - if(!stat && !resting && !buckled) - turns_since_scan++ - if(turns_since_scan > 5) - turns_since_scan = 0 - if((movement_target) && !(isturf(movement_target.loc) || ishuman(movement_target.loc) )) - movement_target = null - stop_automated_movement = 0 - if( !movement_target || !(movement_target.loc in oview(src, 3)) ) - movement_target = null - stop_automated_movement = 0 - for(var/obj/item/weapon/reagent_containers/food/snacks/S in oview(src,3)) - if(isturf(S.loc) || ishuman(S.loc)) - movement_target = S - break - if(movement_target) - stop_automated_movement = 1 - step_to(src,movement_target,1) - sleep(3) - step_to(src,movement_target,1) - sleep(3) - step_to(src,movement_target,1) - - if(movement_target) //Not redundant due to sleeps, Item can be gone in 6 decisecomds - if (movement_target.loc.x < src.x) - set_dir(WEST) - else if (movement_target.loc.x > src.x) - set_dir(EAST) - else if (movement_target.loc.y < src.y) - set_dir(SOUTH) - else if (movement_target.loc.y > src.y) - set_dir(NORTH) - else - set_dir(SOUTH) - - if(isturf(movement_target.loc) ) - UnarmedAttack(movement_target) - else if(ishuman(movement_target.loc) && prob(20)) - visible_emote("stares at the [movement_target] that [movement_target.loc] has with sad puppy eyes.") - - if(prob(1)) - visible_emote(pick("dances around","chases their tail")) - spawn(0) - for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2)) - set_dir(i) - sleep(1) - -/obj/item/weapon/reagent_containers/food/snacks/meat/corgi - name = "corgi meat" - desc = "Tastes like... well, you know..." - -/mob/living/simple_mob/corgi/attackby(var/obj/item/O as obj, var/mob/user as mob) //Marker -Agouri - if(istype(O, /obj/item/weapon/newspaper)) - if(!stat) - for(var/mob/M in viewers(user, null)) - if ((M.client && !( M.blinded ))) - M.show_message("[user] baps [name] on the nose with the rolled up [O]") - spawn(0) - for(var/i in list(1,2,4,8,4,2,1,2)) - set_dir(i) - sleep(1) - else - ..() - -/mob/living/simple_mob/corgi/regenerate_icons() - overlays = list() - - if(inventory_head) - var/head_icon_state = inventory_head.icon_state - if(health <= 0) - head_icon_state += "2" - - var/icon/head_icon = image('icons/mob/corgi_head.dmi',head_icon_state) - if(head_icon) - overlays += head_icon - - if(inventory_back) - var/back_icon_state = inventory_back.icon_state - if(health <= 0) - back_icon_state += "2" - - var/icon/back_icon = image('icons/mob/corgi_back.dmi',back_icon_state) - if(back_icon) - overlays += back_icon - - return - - -/mob/living/simple_mob/corgi/puppy - name = "corgi puppy" - real_name = "corgi" - desc = "It's a corgi puppy." - icon_state = "puppy" - icon_living = "puppy" - icon_dead = "puppy_dead" - -//pupplies cannot wear anything. -/mob/living/simple_mob/corgi/puppy/Topic(href, href_list) - if(href_list["remove_inv"] || href_list["add_inv"]) - usr << "You can't fit this on [src]" - return - ..() - - -//LISA! SQUEEEEEEEEE~ -/mob/living/simple_mob/corgi/Lisa - name = "Lisa" - real_name = "Lisa" - gender = FEMALE - desc = "It's a corgi with a cute pink bow." - icon_state = "lisa" - icon_living = "lisa" - icon_dead = "lisa_dead" - response_help = "pets" - response_disarm = "bops" - response_harm = "kicks" - var/turns_since_scan = 0 - var/puppies = 0 - -//Lisa already has a cute bow! -/mob/living/simple_mob/corgi/Lisa/Topic(href, href_list) - if(href_list["remove_inv"] || href_list["add_inv"]) - to_chat(usr, "[src] already has a cute bow!") - return - ..() - -/mob/living/simple_mob/corgi/Lisa/Life() - ..() - - if(!stat && !resting && !buckled) - turns_since_scan++ - if(turns_since_scan > 15) - turns_since_scan = 0 - var/alone = 1 - var/ian = 0 - for(var/mob/M in oviewers(7, src)) - if(istype(M, /mob/living/simple_mob/corgi/Ian)) - if(M.client) - alone = 0 - break - else - ian = M - else - alone = 0 - break - if(alone && ian && puppies < 4) - if(near_camera(src) || near_camera(ian)) - return - new /mob/living/simple_mob/corgi/puppy(loc) - - - if(prob(1)) - visible_emote(pick("dances around","chases her tail")) - spawn(0) - for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2)) - set_dir(i) - sleep(1) - - -//Technically this should be like, its own file or something or a subset of dog but whatever. Not a coder. -/mob/living/simple_mob/corgi/tamaskan - name = "tamaskan" - real_name = "tamaskan" - desc = "It's a tamaskan." - icon_state = "tamaskan" - icon_living = "tamaskan" - icon_dead = "tamaskan_dead" - - retaliate = 1 //Tamaskans are bigass dogs, okay? - -/mob/living/simple_mob/corgi/tamaskan/spice - name = "Spice" - real_name = "Spice" //Intended to hold the name without altering it. - gender = FEMALE - desc = "It's a tamaskan, the name Spice can be found on its collar." - var/turns_since_scan = 0 - var/obj/movement_target - response_help = "pets" - response_disarm = "bops" - response_harm = "kicks" diff --git a/code/modules/mob/living/simple_animal/animals/corgi_vr.dm b/code/modules/mob/living/simple_animal/animals/corgi_vr.dm deleted file mode 100644 index 3ef7f472f89..00000000000 --- a/code/modules/mob/living/simple_animal/animals/corgi_vr.dm +++ /dev/null @@ -1,218 +0,0 @@ -/mob/living/simple_mob/corgi/show_inv(mob/user as mob) - user.set_machine(src) - if(user.stat) return - - var/dat = "
Inventory of [name]

" - if(inventory_head) - dat += "
Head: [inventory_head] (Remove)" - else - dat += "
Head: Nothing" - if(inventory_back) - dat += "
Back: [inventory_back] (Remove)" - else - dat += "
Back: Nothing" - - user << browse(dat, text("window=mob[];size=325x500", name)) - onclose(user, "mob[real_name]") - return - -/mob/living/simple_mob/corgi/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(inventory_head && inventory_back) - //helmet and armor = 100% protection - if( istype(inventory_head,/obj/item/clothing/head/helmet) && istype(inventory_back,/obj/item/clothing/suit/armor) ) - if( O.force ) - usr << "This animal is wearing too much armor. You can't cause them any damage." - for (var/mob/M in viewers(src, null)) - M.show_message("[user] hits [src] with the [O], however [src] is too armored.") - else - usr << "This animal is wearing too much armor. You can't reach its skin." - for (var/mob/M in viewers(src, null)) - M.show_message("[user] gently taps [src] with the [O].") - if(prob(15)) - visible_emote("looks at [user] with [pick("an amused","an annoyed","a confused","a resentful", "a happy", "an excited")] expression on \his face") - return - ..() - -/mob/living/simple_mob/corgi/Topic(href, href_list) - if(usr.stat) return - - //Removing from inventory - if(href_list["remove_inv"]) - if(!Adjacent(usr)) - return - var/remove_from = href_list["remove_inv"] - switch(remove_from) - if("head") - if(inventory_head) - name = real_name - desc = initial(desc) - speak = list("YAP", "Woof!", "Bark!", "AUUUUUU") - speak_emote = list("barks", "woofs") - emote_hear = list("barks", "woofs", "yaps","pants") - emote_see = list("shakes its head", "shivers") - desc = "It's a corgi." - inventory_head.loc = src.loc - inventory_head = null - regenerate_icons() - else - to_chat(usr, "There is nothing to remove from its [remove_from].") - return - if("back") - if(inventory_back) - inventory_back.loc = src.loc - inventory_back = null - regenerate_icons() - else - to_chat(usr, "There is nothing to remove from its [remove_from].") - return - - //Adding things to inventory - else if(href_list["add_inv"]) - if(!Adjacent(usr)) - return - var/add_to = href_list["add_inv"] - if(!usr.get_active_hand()) - usr << "You have nothing in your hand to put on its [add_to]." - return - switch(add_to) - if("head") - if(inventory_head) - usr << "It's is already wearing something." - return - else - place_on_head(usr.get_active_hand()) - - var/obj/item/item_to_add = usr.get_active_hand() - if(!item_to_add) - return - - var/list/allowed_types = list( - /obj/item/weapon/bedsheet, - /obj/item/clothing/glasses/sunglasses, - /obj/item/clothing/head/caphat, - /obj/item/clothing/head/that, - /obj/item/clothing/head/beret, - /obj/item/clothing/head/nursehat, - /obj/item/clothing/head/pirate, - /obj/item/clothing/head/ushanka, - /obj/item/clothing/head/chefhat, - /obj/item/clothing/head/wizard, - /obj/item/clothing/head/wizard/fake, - /obj/item/clothing/head/hardhat, - /obj/item/clothing/head/hardhat/white, - /obj/item/clothing/head/helmet, - /obj/item/clothing/head/helmet/space/santahat, - /obj/item/clothing/head/collectable/chef, - /obj/item/clothing/head/collectable/police, - /obj/item/clothing/head/collectable/wizard, - /obj/item/clothing/head/collectable/rabbitears, - /obj/item/clothing/head/collectable/beret, - /obj/item/clothing/head/collectable/pirate, - /obj/item/clothing/head/collectable/hardhat, - /obj/item/clothing/head/collectable/captain, - /obj/item/clothing/head/collectable/paper, - /obj/item/clothing/head/soft - ) - - if( ! ( item_to_add.type in allowed_types ) ) - usr << "It doesn't seem too keen on wearing that item." - return - - usr.drop_item() - - place_on_head(item_to_add) - - if("back") - if(inventory_back) - usr << "It's already wearing something." - return - else - var/obj/item/item_to_add = usr.get_active_hand() - if(!item_to_add) - return - - //Corgis are supposed to be simpler, so only a select few objects can actually be put - //to be compatible with them. The objects are below. - - var/list/allowed_types = list( - /obj/item/clothing/suit/armor/vest, - /obj/item/device/radio - ) - - if( ! ( item_to_add.type in allowed_types ) ) - usr << "This object won't fit." - return - - usr.drop_item() - item_to_add.loc = src - src.inventory_back = item_to_add - regenerate_icons() - else - ..() - -/mob/living/simple_mob/corgi/proc/place_on_head(obj/item/item_to_add) - item_to_add.loc = src - src.inventory_head = item_to_add - regenerate_icons() - - //Various hats and items (worn on his head) change Ian's behaviour. His attributes are reset when a HAT is removed. - switch(inventory_head && inventory_head.type) - if(/obj/item/clothing/head/caphat, /obj/item/clothing/head/collectable/captain) - name = "Captain [real_name]" - desc = "Probably better than the last captain." -/* - if(/obj/item/clothing/head/accessory/kitty, /obj/item/clothing/head/collectable/kitty) - name = "Runtime" - emote_see = list("coughs up a furball", "stretches") - emote_hear = list("purrs") - speak = list("Purrr", "Meow!", "MAOOOOOW!", "HISSSSS", "MEEEEEEW") - desc = "It's a cute little kitty-cat! ... wait ... what the hell?" - if(/obj/item/clothing/head/accessory/bunny, /obj/item/clothing/head/collectable/rabbitears) - name = "Hoppy" - emote_see = list("twitches its nose", "hops around a bit") - desc = "This is hoppy. It's a corgi-...urmm... bunny rabbit" -*/ - if(/obj/item/clothing/head/beret, /obj/item/clothing/head/collectable/beret) - name = "Yann" - desc = "Mon dieu! C'est un chien!" - speak = list("le woof!", "le bark!", "JAPPE!!") - emote_see = list("cowers in fear", "surrenders", "plays dead","looks as though there is a wall in front of him") -/* - if(/obj/item/clothing/head/det_hat) - name = "Detective [real_name]" - desc = "[name] sees through your lies..." - emote_see = list("investigates the area","sniffs around for clues","searches for scooby snacks") -*/ - if(/obj/item/clothing/head/nursehat) - name = "Nurse [real_name]" - desc = "[name] needs 100cc of beef jerky...STAT!" - if(/obj/item/clothing/head/pirate, /obj/item/clothing/head/collectable/pirate) - name = "[pick("Ol'","Scurvy","Black","Rum","Gammy","Bloody","Gangrene","Death","Long-John")] [pick("kibble","leg","beard","tooth","poop-deck","Threepwood","Le Chuck","corsair","Silver","Crusoe")]" - desc = "Yaarghh!! Thar' be a scurvy dog!" - emote_see = list("hunts for treasure","stares coldly...","gnashes his tiny corgi teeth") - emote_hear = list("growls ferociously", "snarls") - speak = list("Arrrrgh!!","Grrrrrr!") - if(/obj/item/clothing/head/ushanka) - name = "[pick("Comrade","Commissar","Glorious Leader")] [real_name]" - desc = "A follower of Karl Barx." - emote_see = list("contemplates the failings of the capitalist economic model", "ponders the pros and cons of vangaurdism") - if(/obj/item/clothing/head/collectable/police) - name = "Officer [real_name]" - emote_see = list("drools","looks for donuts") - desc = "Stop right there criminal scum!" - if(/obj/item/clothing/head/wizard/fake, /obj/item/clothing/head/wizard, /obj/item/clothing/head/collectable/wizard) - name = "Grandwizard [real_name]" - speak = list("YAP", "Woof!", "Bark!", "AUUUUUU", "EI NATH!") - if(/obj/item/weapon/bedsheet) - name = "\improper Ghost" - speak = list("WoooOOOooo~","AUUUUUUUUUUUUUUUUUU") - emote_see = list("stumbles around", "shivers") - emote_hear = list("howls","groans") - desc = "Spooky!" - if(/obj/item/clothing/head/helmet/space/santahat) - name = "Rudolph the Red-Nosed Corgi" - emote_hear = list("barks christmas songs", "yaps") - desc = "He has a very shiny nose." - if(/obj/item/clothing/head/soft) - name = "Corgi Tech [real_name]" - desc = "The reason your yellow gloves have chew-marks." diff --git a/code/modules/mob/living/simple_animal/animals/crab.dm b/code/modules/mob/living/simple_animal/animals/crab.dm deleted file mode 100644 index 0808b11dab5..00000000000 --- a/code/modules/mob/living/simple_animal/animals/crab.dm +++ /dev/null @@ -1,87 +0,0 @@ -//Look Sir, free crabs! -/mob/living/simple_mob/crab - name = "crab" - desc = "A hard-shelled crustacean. Seems quite content to lounge around all the time." - tt_desc = "E Cancer bellianus" - icon_state = "crab" - icon_living = "crab" - icon_dead = "crab_dead" - faction = "crabs" - intelligence_level = SA_ANIMAL - - wander = 0 - stop_automated_movement = 1 - turns_per_move = 5 - mob_size = MOB_SMALL - - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "stomps" - friendly = "pinches" - - speak_chance = 1 - speak_emote = list("clicks") - emote_hear = list("clicks") - emote_see = list("clacks") - - var/obj/item/inventory_head - var/obj/item/inventory_mask - -/mob/living/simple_mob/crab/Life() - ..() - //CRAB movement, I'm not porting this up to SA because... "sideways-only movement" var nothanks - if(!ckey && !stat) - if(isturf(src.loc) && !resting && !buckled) //This is so it only moves if it's not inside a closet, gentics machine, etc. - lifes_since_move++ - if(lifes_since_move >= turns_per_move) - Move(get_step(src,pick(4,8))) - lifes_since_move = 0 - regenerate_icons() - -//COFFEE! SQUEEEEEEEEE! -/mob/living/simple_mob/crab/Coffee - name = "Coffee" - real_name = "Coffee" - desc = "It's Coffee, the other pet!" - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "stomps" - -//Sif Crabs -/mob/living/simple_mob/giant_crab - name = "giant crab" - desc = "A large, hard-shelled crustacean. This one is mostly grey." - tt_desc = "S Cancer holligus" - icon_state = "sif_crab" - icon_living = "sif_crab" - icon_dead = "sif_crab_dead" - faction = "crabs" - intelligence_level = SA_ANIMAL - - maxHealth = 200 - health = 200 - - mob_size = MOB_LARGE - cooperative = 1 - retaliate = 1 - turns_per_move = 3 - - minbodytemp = 175 - - melee_damage_lower = 22 - melee_damage_upper = 35 - attack_armor_pen = 35 - attack_sharp = 1 - attack_edge = 1 - - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "stomps" - friendly = "pinches" - - speak_chance = 1 - speak_emote = list("clicks") - emote_hear = list("clicks") - emote_see = list("clacks") diff --git a/code/modules/mob/living/simple_animal/animals/fish.dm b/code/modules/mob/living/simple_animal/animals/fish.dm deleted file mode 100644 index c4d01233eaf..00000000000 --- a/code/modules/mob/living/simple_animal/animals/fish.dm +++ /dev/null @@ -1,80 +0,0 @@ -// Different types of fish! They are all subtypes of this tho -/mob/living/simple_mob/fish - name = "fish" - desc = "Its a fishy. No touchy fishy." - icon = 'icons/mob/fish.dmi' - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat - intelligence_level = SA_ANIMAL - - // By defautl they can be in any water turf. Subtypes might restrict to deep/shallow etc - var/global/list/suitable_turf_types = list( - /turf/simulated/floor/beach/water, - /turf/simulated/floor/beach/coastline, - /turf/simulated/floor/holofloor/beach/water, - /turf/simulated/floor/holofloor/beach/coastline, - /turf/simulated/floor/water - ) - -// Don't swim out of the water -/mob/living/simple_mob/fish/handle_wander_movement() - if(isturf(src.loc) && !resting && !buckled && canmove) //Physically capable of moving? - lifes_since_move++ //Increment turns since move (turns are life() cycles) - if(lifes_since_move >= turns_per_move) - if(!(stop_when_pulled && pulledby)) //Some animals don't move when pulled - var/moving_to = 0 // otherwise it always picks 4, fuck if I know. Did I mention fuck BYOND - moving_to = pick(cardinal) - dir = moving_to //How about we turn them the direction they are moving, yay. - var/turf/T = get_step(src,moving_to) - if(T && is_type_in_list(T, suitable_turf_types)) - Move(T) - lifes_since_move = 0 - -// Take damage if we are not in water -/mob/living/simple_mob/fish/handle_breathing() - var/turf/T = get_turf(src) - if(T && !is_type_in_list(T, suitable_turf_types)) - if(prob(50)) - say(pick("Blub", "Glub", "Burble")) - adjustBruteLoss(unsuitable_atoms_damage) - -/mob/living/simple_mob/fish/bass - name = "bass" - tt_desc = "E Micropterus notius" - icon_state = "bass-swim" - icon_living = "bass-swim" - icon_dead = "bass-dead" - -/mob/living/simple_mob/fish/trout - name = "trout" - tt_desc = "E Salmo trutta" - icon_state = "trout-swim" - icon_living = "trout-swim" - icon_dead = "trout-dead" - -/mob/living/simple_mob/fish/salmon - name = "salmon" - tt_desc = "E Oncorhynchus nerka" - icon_state = "salmon-swim" - icon_living = "salmon-swim" - icon_dead = "salmon-dead" - -/mob/living/simple_mob/fish/perch - name = "perch" - tt_desc = "E Perca flavescens" - icon_state = "perch-swim" - icon_living = "perch-swim" - icon_dead = "perch-dead" - -/mob/living/simple_mob/fish/pike - name = "pike" - tt_desc = "E Esox aquitanicus" - icon_state = "pike-swim" - icon_living = "pike-swim" - icon_dead = "pike-dead" - -/mob/living/simple_mob/fish/koi - name = "koi" - tt_desc = "E Cyprinus rubrofuscus" - icon_state = "koi-swim" - icon_living = "koi-swim" - icon_dead = "koi-dead" diff --git a/code/modules/mob/living/simple_animal/animals/fish_vr.dm b/code/modules/mob/living/simple_animal/animals/fish_vr.dm deleted file mode 100644 index 39cd051d6a0..00000000000 --- a/code/modules/mob/living/simple_animal/animals/fish_vr.dm +++ /dev/null @@ -1,41 +0,0 @@ -/mob/living/simple_mob/fish/koi/poisonous - desc = "A genetic marvel, combining the docility and aesthetics of the koi with some of the resiliency and cunning of the noble space carp." - health = 50 - maxHealth = 50 - -/mob/living/simple_mob/fish/koi/poisonous/New() - ..() - create_reagents(60) - reagents.add_reagent("toxin", 45) - reagents.add_reagent("impedrezene", 15) - -/mob/living/simple_mob/fish/koi/poisonous/Life() - ..() - if(isbelly(loc) && prob(10)) - var/obj/belly/B = loc - sting(B.owner) - -/mob/living/simple_mob/fish/koi/poisonous/react_to_attack(var/atom/A) - if(isliving(A) && Adjacent(A)) - var/mob/living/M = A - visible_message("\The [src][is_dead()?"'s corpse":""] flails at [M]!") - SpinAnimation(7,1) - if(prob(75)) - if(sting(M)) - to_chat(M, "You feel a tiny prick.") - if(is_dead()) - return - for(var/i = 1 to 3) - var/turf/T = get_step_away(src, M) - if(T && is_type_in_list(T, suitable_turf_types)) - Move(T) - else - break - sleep(3) - -/mob/living/simple_mob/fish/koi/poisonous/proc/sting(var/mob/living/M) - if(!M.reagents) - return 0 - M.reagents.add_reagent("toxin", 2) - M.reagents.add_reagent("impedrezene", 1) - return 1 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/animals/fluffy_vr.dm b/code/modules/mob/living/simple_animal/animals/fluffy_vr.dm deleted file mode 100644 index 9b9073fb491..00000000000 --- a/code/modules/mob/living/simple_animal/animals/fluffy_vr.dm +++ /dev/null @@ -1,39 +0,0 @@ -/mob/living/simple_mob/fluffy - name = "Fluffy" - desc = "It's a pink Diyaab! It seems to be very tame and quiet." - icon = 'icons/mob/animal_vr.dmi' - icon_state = "fluffy" - icon_living = "fluffy" - icon_dead = "fluffy_dead" - icon_rest = "fluffy_sleep" - - turns_per_move = 10 - see_in_dark = 5 - mob_size = MOB_TINY - - response_help = "scritches" - response_disarm = "bops" - response_harm = "kicks" - - min_oxy = 16 //Require atleast 16kPA oxygen - minbodytemp = 223 //Below -50 Degrees Celcius - maxbodytemp = 323 //Above 50 Degrees Celcius - - speak_chance = 1 - speak = list("Squee","Arf arf","Awoo","Squeak") - speak_emote = list("squeaks", "barks") - emote_hear = list("howls","squeals") - emote_see = list("puffs its fur out", "shakes its fur", "stares directly at you") - - meat_amount = 1 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat - -/mob/living/simple_mob/fluffy/Life() - . = ..() - if(!. || ai_inactive) return - - if(prob(0.5)) - lay_down() - - if(resting && prob(5)) - audible_emote("snuffles.") diff --git a/code/modules/mob/living/simple_animal/animals/fox_vr.dm b/code/modules/mob/living/simple_animal/animals/fox_vr.dm deleted file mode 100644 index 72265c399f7..00000000000 --- a/code/modules/mob/living/simple_animal/animals/fox_vr.dm +++ /dev/null @@ -1,225 +0,0 @@ -/mob/living/simple_mob/fox - name = "fox" - desc = "It's a fox. I wonder what it says?" - tt_desc = "Vulpes vulpes" - icon = 'icons/mob/fox_vr.dmi' - icon_state = "fox2" - icon_living = "fox2" - icon_dead = "fox2_dead" - icon_rest = "fox2_rest" - - investigates = 1 - specific_targets = 1 //Only targets with Found() - run_at_them = 0 //DOMESTICATED - view_range = 5 - - turns_per_move = 5 - see_in_dark = 6 - mob_size = MOB_TINY - - response_help = "scritches" - response_disarm = "gently pushes aside" - response_harm = "kicks" - - min_oxy = 16 //Require atleast 16kPA oxygen - minbodytemp = 223 //Below -50 Degrees Celcius - maxbodytemp = 323 //Above 50 Degrees Celcius - - speak_chance = 1 - speak = list("Ack-Ack","Ack-Ack-Ack-Ackawoooo","Awoo","Tchoff") - speak_emote = list("geckers", "barks") - emote_hear = list("howls","barks") - emote_see = list("shakes its head", "shivers", "geckers") - say_maybe_target = list("Yip?","Yap?") - say_got_target = list("YAP!","YIP!") - - meat_amount = 1 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/fox - - var/turns_since_scan = 0 - var/mob/flee_target - -/mob/living/simple_mob/fox/init_vore() - ..() - var/obj/belly/B = vore_selected - B.name = "Stomach" - B.desc = "Slick foxguts. Cute on the outside, slimy on the inside!" - - B.emote_lists[DM_HOLD] = list( - "The foxguts knead and churn around you harmlessly.", - "With a loud glorp, some air shifts inside the belly.", - "A thick drop of warm bellyslime drips onto you from above.", - "The fox turns suddenly, causing you to shift a little.", - "During a moment of relative silence, you can hear the fox breathing.", - "The slimey stomach walls squeeze you lightly, then relax.") - - B.emote_lists[DM_DIGEST] = list( - "The guts knead at you, trying to work you into thick soup.", - "You're ground on by the slimey walls, treated like a mouse.", - "The acrid air is hard to breathe, and stings at your lungs.", - "You can feel the acids coating you, ground in by the slick walls.", - "The fox's stomach churns hungrily over your form, trying to take you.", - "With a loud glorp, the stomach spills more acids onto you.") - -// All them complicated fox procedures. -/mob/living/simple_mob/fox/Life() - . = ..() - if(!.) return - - handle_flee_target() - -/mob/living/simple_mob/fox/PunchTarget() - if(istype(target_mob,/mob/living/simple_mob/mouse)) - var/mob/living/simple_mob/mouse/mouse = target_mob - mouse.splat() - visible_emote(pick("bites \the [mouse]!","pounces on \the [mouse]!","chomps on \the [mouse]!")) - else - ..() - -/mob/living/simple_mob/fox/Found(var/atom/found_atom) - if(istype(found_atom,/mob/living/simple_mob/mouse)) - return found_atom - -/mob/living/simple_mob/fox/proc/handle_flee_target() - //see if we should stop fleeing - if (flee_target && !(flee_target in ListTargets(view_range))) - flee_target = null - GiveUpMoving() - - if (flee_target && !stat && !buckled) - if (resting) - lay_down() - if(prob(25)) say("GRRRRR!") - stop_automated_movement = 1 - walk_away(src, flee_target, 7, 2) - -/mob/living/simple_mob/fox/react_to_attack(var/atom/A) - if(A == src) return - flee_target = A - turns_since_scan = 5 - -/mob/living/simple_mob/fox/ex_act() - . = ..() - react_to_attack(src.loc) - -/mob/living/simple_mob/fox/MouseDrop(atom/over_object) - var/mob/living/carbon/H = over_object - if(!istype(H) || !Adjacent(H)) return ..() - - if(H.a_intent == "help") - get_scooped(H) - return - else - return ..() - -/mob/living/simple_mob/fox/get_scooped(var/mob/living/carbon/grabber) - if (stat >= DEAD) - return //since the holder icon looks like a living cat - ..() - -//Basic friend AI -/mob/living/simple_mob/fox/fluff - var/mob/living/carbon/human/friend - var/befriend_job = null - -/mob/living/simple_mob/fox/fluff/Life() - . = ..() - if(!. || ai_inactive || !friend) return - - var/friend_dist = get_dist(src,friend) - - if (friend_dist <= 4) - if(stance == STANCE_IDLE) - if(set_follow(friend)) - handle_stance(STANCE_FOLLOW) - - if (friend_dist <= 1) - if (friend.stat >= DEAD || friend.health <= config.health_threshold_softcrit) - if (prob((friend.stat < DEAD)? 50 : 15)) - var/verb = pick("yaps", "howls", "whines") - audible_emote(pick("[verb] in distress.", "[verb] anxiously.")) - else - if (prob(5)) - visible_emote(pick("nips [friend].", - "brushes against [friend].", - "tugs on [friend].", - "chrrrrs.")) - else if (friend.health <= 50) - if (prob(10)) - var/verb = pick("yaps", "howls", "whines") - audible_emote("[verb] anxiously.") - -/mob/living/simple_mob/fox/fluff/verb/friend() - set name = "Become Friends" - set category = "IC" - set src in view(1) - - if(friend && usr == friend) - set_dir(get_dir(src, friend)) - say("Yap!") - return - - if (!(ishuman(usr) && befriend_job && usr.job == befriend_job)) - usr << "[src] ignores you." - return - - friend = usr - - set_dir(get_dir(src, friend)) - say("Yap!") - -/obj/item/weapon/reagent_containers/food/snacks/meat/fox - name = "Fox meat" - desc = "The fox doesn't say a goddamn thing, now." - -//Captain fox -/mob/living/simple_mob/fox/fluff/Renault - name = "Renault" - desc = "Renault, the Colony Director's trustworthy fox. I wonder what it says?" - tt_desc = "Vulpes nobilis" - befriend_job = "Colony Director" - -/mob/living/simple_mob/fox/fluff/Renault/init_vore() - ..() - var/obj/belly/B = vore_selected - B.name = "Stomach" - B.desc = "Slick foxguts. They seem somehow more regal than perhaps other foxes!" - - B.emote_lists[DM_HOLD] = list( - "Renault's stomach walls squeeze around you more tightly for a moment, before relaxing, as if testing you a bit.", - "There's a sudden squeezing as Renault presses a forepaw against his gut over you, squeezing you against the slick walls.", - "The 'head fox' has a stomach that seems to think you belong to it. It might be hard to argue, as it kneads at your form.", - "If being in the captain's fox is a promotion, it might not feel like one. The belly just coats you with more thick foxslime.", - "It doesn't seem like Renault wants to let you out. The stomach and owner possessively squeeze around you.", - "Renault's stomach walls squeeze closer, as he belches quietly, before swallowing more air. Does he do that on purpose?") - - B.emote_lists[DM_DIGEST] = list( - "Renault's stomach walls grind hungrily inwards, kneading acids against your form, and treating you like any other food.", - "The captain's fox impatiently kneads and works acids against you, trying to claim your body for fuel.", - "The walls knead in firmly, squeezing and tossing you around briefly in disorienting aggression.", - "Renault belches, letting the remaining air grow more acrid. It burns your lungs with each breath.", - "A thick glob of acids drip down from above, adding to the pool of caustic fluids in Renault's belly.", - "There's a loud gurgle as the stomach declares the intent to make you a part of Renault.") - -/mob/living/simple_mob/fox/syndicate - name = "syndi-fox" - desc = "It's a DASTARDLY fox! The horror! Call the shuttle!" - tt_desc = "Vulpes malus" - icon = 'icons/mob/fox_vr.dmi' - icon_state = "syndifox" - icon_living = "syndifox" - icon_dead = "syndifox_dead" - icon_rest = "syndifox_rest" - - // this fox wears a hardsuit - maxHealth = 100 - health = 100 - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - minbodytemp = 0 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/animals/giant_spider.dm b/code/modules/mob/living/simple_animal/animals/giant_spider.dm deleted file mode 100644 index c6acf2a769a..00000000000 --- a/code/modules/mob/living/simple_animal/animals/giant_spider.dm +++ /dev/null @@ -1,589 +0,0 @@ - -#define SPINNING_WEB 1 -#define LAYING_EGGS 2 -#define MOVING_TO_TARGET 3 -#define SPINNING_COCOON 4 - -//basic spider mob, these generally guard nests -/mob/living/simple_mob/hostile/giant_spider - name = "giant spider" - desc = "Furry and brown, it makes you shudder to look at it. This one has deep red eyes." - tt_desc = "X Brachypelma phorus" - icon_state = "guard" - icon_living = "guard" - icon_dead = "guard_dead" - - faction = "spiders" - intelligence_level = SA_ANIMAL - maxHealth = 200 - health = 200 - pass_flags = PASSTABLE - move_to_delay = 6 - speed = 3 - - stop_when_pulled = 0 - turns_per_move = 5 - see_in_dark = 10 - - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "punches" - - melee_damage_lower = 18 - melee_damage_upper = 30 - attack_sharp = 1 - attack_edge = 1 - - heat_damage_per_tick = 20 - cold_damage_per_tick = 20 - - speak_chance = 5 - speak_emote = list("chitters") - emote_hear = list("chitters") - - meat_type = /obj/item/weapon/reagent_containers/food/snacks/xenomeat/spidermeat - - var/busy = 0 - var/poison_per_bite = 5 - var/poison_chance = 10 - var/poison_type = "spidertoxin" - var/image/eye_layer = null - - low_priority = TRUE //VOREStation Edit - -/mob/living/simple_mob/hostile/giant_spider/proc/add_eyes() - if(!eye_layer) - eye_layer = image(icon, "[icon_state]-eyes") - eye_layer.plane = PLANE_LIGHTING_ABOVE - - overlays += eye_layer - -/mob/living/simple_mob/hostile/giant_spider/proc/remove_eyes() - overlays -= eye_layer - -/* -Nurse Family -*/ - -//nursemaids - these create webs and eggs -/mob/living/simple_mob/hostile/giant_spider/nurse - desc = "Furry and beige, it makes you shudder to look at it. This one has brilliant green eyes." - tt_desc = "X Brachypelma phorus laetus" - icon_state = "nurse" - icon_living = "nurse" - icon_dead = "nurse_dead" - - maxHealth = 40 - health = 40 - - melee_damage_lower = 8 - melee_damage_upper = 15 - poison_per_bite = 7 - poison_type = "spidertoxin" // VOREStation edit, original is stoxin. (sleep toxins) - - var/fed = 0 - var/atom/cocoon_target - var/egg_inject_chance = 5 - -/mob/living/simple_mob/hostile/giant_spider/nurse/hat - desc = "Furry and beige, it makes you shudder to look at it. This one has brilliant green eyes and a tiny nurse hat." - icon_state = "nursemed" - icon_living = "nursemed" - icon_dead = "nursemed_dead" - - maxHealth = 50 - health = 50 - -// VOREStation Edit - melee_damage_lower = 8 - melee_damage_upper = 16 - poison_type = "tramadol" - poison_chance = 15 -// VOREStation Edit End - -/mob/living/simple_mob/hostile/giant_spider/nurse/queen - desc = "Absolutely gigantic, this creature is horror itself." - tt_desc = "X Brachypelma phorus tyrannus" - icon = 'icons/mob/64x64.dmi' - icon_state = "spider_queen" - icon_living = "spider_queen" - icon_dead = "spider_queen_dead" - - maxHealth = 320 - health = 320 - - melee_damage_lower = 20 - melee_damage_upper = 30 - attack_armor_pen = 25 - - poison_per_bite = 10 - egg_inject_chance = 10 - - pixel_x = -16 - pixel_y = -16 - old_x = -16 - old_y = -16 - -/mob/living/simple_mob/hostile/giant_spider/webslinger - desc = "Furry and green, it makes you shudder to look at it. This one has brilliant green eyes, and a cloak of web." - tt_desc = "X Brachypelma phorus balisticus" - icon_state = "webslinger" - icon_living = "webslinger" - icon_dead = "webslinger_dead" - - maxHealth = 90 - health = 90 - - projectilesound = 'sound/weapons/thudswoosh.ogg' - projectiletype = /obj/item/projectile/bola - ranged = 1 - firing_lines = 1 - cooperative = 1 - shoot_range = 5 - - melee_damage_lower = 8 - melee_damage_upper = 15 - poison_per_bite = 2 - poison_type = "psilocybin" - - spattack_prob = 15 - spattack_min_range = 0 - spattack_max_range = 5 - -/mob/living/simple_mob/hostile/giant_spider/webslinger/AttackTarget() //One day. - var/mob/living/carbon/human/victim = null //Webslinger needs to know if its target is human later. - if(ishuman(target_mob)) - victim = target_mob - if(!victim.legcuffed) - projectiletype = /obj/item/projectile/bola - shoot_range = 7 - else - projectiletype = /obj/item/projectile/webball - shoot_range = 5 - else - projectiletype = /obj/item/projectile/webball - shoot_range = 5 - return ..() - -/mob/living/simple_mob/hostile/giant_spider/carrier - desc = "Furry, beige, and red, it makes you shudder to look at it. This one has luminous green eyes." - tt_desc = "X Brachypelma phorus gerulus" - icon_state = "carrier" - icon_living = "carrier" - icon_dead = "carrier_dead" - - maxHealth = 100 - health = 100 - - melee_damage_lower = 8 - melee_damage_upper = 25 - - poison_per_bite = 3 - poison_type = "chloralhydrate" - - var/spiderling_count = 0 - var/spiderling_type = /obj/effect/spider/spiderling - var/swarmling_type = /mob/living/simple_mob/hostile/giant_spider/hunter - var/swarmling_faction = "spiders" - -/mob/living/simple_mob/hostile/giant_spider/carrier/New() - spiderling_count = rand(5,10) - adjust_scale(1.2) - ..() - -/mob/living/simple_mob/hostile/giant_spider/carrier/death() - visible_message("\The [src]'s abdomen splits as it rolls over, spiderlings crawling from the wound.") - spawn(1) - for(var/I = 1 to spiderling_count) - if(prob(10) && src) - var/mob/living/simple_animal/hostile/giant_spider/swarmling = new swarmling_type(src.loc) - var/swarm_health = FLOOR(swarmling.maxHealth * 0.4, 1) - var/swarm_dam_lower = FLOOR(melee_damage_lower * 0.4, 1) - var/swarm_dam_upper = FLOOR(melee_damage_upper * 0.4, 1) - swarmling.name = "spiderling" - swarmling.maxHealth = swarm_health - swarmling.health = swarm_health - swarmling.melee_damage_lower = swarm_dam_lower - swarmling.melee_damage_upper = swarm_dam_upper - swarmling.faction = swarmling_faction - swarmling.adjust_scale(0.75) - else if(src) - var/obj/effect/spider/spiderling/child = new spiderling_type(src.loc) - child.skitter() - else - break - return ..() - -/mob/living/simple_mob/hostile/giant_spider/carrier/recursive - desc = "Furry, beige, and red, it makes you shudder to look at it. This one has luminous green eyes. You have a distinctly bad feeling about this." - - swarmling_type = /mob/living/simple_mob/hostile/giant_spider/carrier/recursive - -/* -Hunter Family -*/ - -//hunters have the most poison and move the fastest, so they can find prey - -/mob/living/simple_mob/hostile/giant_spider/hunter - desc = "Furry and black, it makes you shudder to look at it. This one has sparkling purple eyes." - tt_desc = "X Brachypelma phorus venandi" - icon_state = "hunter" - icon_living = "hunter" - icon_dead = "hunter_dead" - - maxHealth = 120 - health = 120 - move_to_delay = 4 - - poison_per_bite = 5 - -/mob/living/simple_mob/hostile/giant_spider/lurker - desc = "Translucent and white, it makes you shudder to look at it. This one has incandescent red eyes." - tt_desc = "X Brachypelma phorus insidator" - icon_state = "lurker" - icon_living = "lurker" - icon_dead = "lurker_dead" - alpha = 45 - - maxHealth = 100 - health = 100 - move_to_delay = 4 - - melee_damage_lower = 8 - melee_damage_upper = 20 - - - poison_chance = 20 - poison_type = "cryptobiolin" - poison_per_bite = 2 - -/mob/living/simple_mob/hostile/giant_spider/lurker/death() - alpha = 255 - return ..() - -/mob/living/simple_mob/hostile/giant_spider/tunneler - desc = "Sandy and brown, it makes you shudder to look at it. This one has glittering yellow eyes." - tt_desc = "X Brachypelma phorus cannalis" - icon_state = "tunneler" - icon_living = "tunneler" - icon_dead = "tunneler_dead" - - maxHealth = 120 - health = 120 - move_to_delay = 4 - - melee_damage_lower = 10 - melee_damage_upper = 20 - - poison_chance = 15 - poison_per_bite = 3 - poison_type = "serotrotium_v" - -/mob/living/simple_mob/hostile/giant_spider/tunneler/death() - spawn(1) - for(var/I = 1 to rand(3,6)) - if(src) - new/obj/item/weapon/ore/glass(src.loc) - else - break - return ..() - -/* -Guard Family -*/ - -/mob/living/simple_mob/hostile/giant_spider/pepper - desc = "Red and brown, it makes you shudder to look at it. This one has glinting red eyes." - tt_desc = "X Brachypelma phorus ignis" - icon_state = "pepper" - icon_living = "pepper" - icon_dead = "pepper_dead" - - maxHealth = 210 - health = 210 - - melee_damage_lower = 8 - melee_damage_upper = 15 - - poison_chance = 20 - poison_per_bite = 5 - poison_type = "condensedcapsaicin_v" - -/mob/living/simple_mob/hostile/giant_spider/pepper/New() - adjust_scale(1.1) - ..() - -/mob/living/simple_mob/hostile/giant_spider/thermic - desc = "Mirage-cloaked and orange, it makes you shudder to look at it. This one has simmering orange eyes." - tt_desc = "X Brachypelma phorus incaendium" - icon_state = "pit" - icon_living = "pit" - icon_dead = "pit_dead" - - maxHealth = 175 - health = 175 - - melee_damage_lower = 10 - melee_damage_upper = 25 - - poison_chance = 30 - poison_per_bite = 1 - poison_type = "thermite_v" - -/mob/living/simple_mob/hostile/giant_spider/electric - desc = "Spined and yellow, it makes you shudder to look at it. This one has flickering gold eyes." - tt_desc = "X Brachypelma phorus aromatitis" - icon_state = "spark" - icon_living = "spark" - icon_dead = "spark_dead" - - maxHealth = 210 - health = 210 - taser_kill = 0 //It -is- the taser. - - melee_damage_lower = 10 - melee_damage_upper = 25 - - ranged = 1 - projectilesound = 'sound/weapons/taser2.ogg' - projectiletype = /obj/item/projectile/beam/stun/weak - firing_lines = 1 - cooperative = 1 - - poison_chance = 15 - poison_per_bite = 3 - poison_type = "stimm" - -/mob/living/simple_mob/hostile/giant_spider/phorogenic - desc = "Crystalline and purple, it makes you shudder to look at it. This one has haunting purple eyes." - tt_desc = "X Brachypelma phorus phorus" - icon_state = "phoron" - icon_living = "phoron" - icon_dead = "phoron_dead" - - maxHealth = 225 - health = 225 - taser_kill = 0 //You will need more than a peashooter to kill the juggernaut. - - melee_damage_lower = 25 - melee_damage_upper = 40 - attack_armor_pen = 15 - - poison_chance = 30 - poison_per_bite = 0.5 - poison_type = "phoron" - - var/exploded = 0 - -/mob/living/simple_mob/hostile/giant_spider/phorogenic/New() - adjust_scale(1.25) - return ..() - -/mob/living/simple_mob/hostile/giant_spider/phorogenic/death() - visible_message("\The [src]'s body begins to rupture!") - spawn(rand(1,5)) - if(src && !exploded) - visible_message("\The [src]'s body detonates!") - exploded = 1 - explosion(src.loc, 1, 2, 4, 6) - return ..() - -/mob/living/simple_mob/hostile/giant_spider/frost - desc = "Icy and blue, it makes you shudder to look at it. This one has brilliant blue eyes." - tt_desc = "X Brachypelma phorus pruinae" - icon_state = "frost" - icon_living = "frost" - icon_dead = "frost_dead" - - maxHealth = 175 - health = 175 - - poison_per_bite = 5 - poison_type = "cryotoxin" - -/* -Spider Procs -*/ - -/mob/living/simple_mob/hostile/giant_spider/New(var/location, var/atom/parent) - get_light_and_color(parent) - add_eyes() - ..() - -/mob/living/simple_mob/hostile/giant_spider/death() - remove_eyes() - ..() - -/mob/living/simple_mob/hostile/giant_spider/DoPunch(var/atom/A) - . = ..() - if(.) // If we succeeded in hitting. - if(isliving(A)) - var/mob/living/L = A - if(L.reagents) - var/target_zone = pick(BP_TORSO,BP_TORSO,BP_TORSO,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_HEAD) - if(L.can_inject(src, null, target_zone)) - L.reagents.add_reagent(poison_type, poison_per_bite) - if(prob(poison_chance)) - to_chat(L, "You feel a tiny prick.") - L.reagents.add_reagent(poison_type, poison_per_bite) - -/mob/living/simple_mob/hostile/giant_spider/nurse/DoPunch(var/atom/A) - . = ..() - if(.) // If we succeeded in hitting. - if(ishuman(A)) - var/mob/living/carbon/human/H = A - if(prob(egg_inject_chance)) - var/target_zone = pick(BP_TORSO,BP_TORSO,BP_TORSO,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_HEAD) - if(H.can_inject(src, null, target_zone)) - var/obj/item/organ/external/O = H.get_organ(target_zone) - var/eggcount - for(var/obj/I in O.implants) - if(istype(I, /obj/effect/spider/eggcluster)) - eggcount ++ - if(!eggcount) - var/eggs = new /obj/effect/spider/eggcluster/small(O, src) - O.implants += eggs - to_chat(H, "\The [src] injects something into your [O.name]!") - -/mob/living/simple_mob/hostile/giant_spider/webslinger/DoPunch(var/atom/A) - . = ..() - if(.) // If we succeeded in hitting. - if(isliving(A)) - var/mob/living/L = A - var/obj/effect/spider/stickyweb/W = locate() in get_turf(L) - if(!W && prob(75)) - visible_message("\The [src] throws a layer of web at \the [L]!") - new /obj/effect/spider/stickyweb(L.loc) - -/mob/living/simple_mob/hostile/giant_spider/handle_stance() - . = ..() - if(ai_inactive) return - - switch(stance) - if(STANCE_IDLE) - //1% chance to skitter madly away - if(!busy && prob(1)) - /*var/list/move_targets = list() - for(var/turf/T in orange(20, src)) - move_targets.Add(T)*/ - stop_automated_movement = 1 - walk_to(src, pick(orange(20, src)), 1, move_to_delay) - spawn(5 SECONDS) - stop_automated_movement = 0 - walk(src,0) - -/mob/living/simple_mob/hostile/giant_spider/nurse/proc/GiveUp(var/C) - spawn(10 SECONDS) - if(busy == MOVING_TO_TARGET) - if(cocoon_target == C && get_dist(src,cocoon_target) > 1) - cocoon_target = null - busy = 0 - stop_automated_movement = 0 - -/mob/living/simple_mob/hostile/giant_spider/nurse/Life() - . = ..() - if(!. || ai_inactive) return - - if(stance == STANCE_IDLE) - var/list/can_see = view(src, 10) - //30% chance to stop wandering and do something - if(!busy && prob(30)) - //first, check for potential food nearby to cocoon - for(var/mob/living/C in can_see) - if(C.stat) - cocoon_target = C - busy = MOVING_TO_TARGET - walk_to(src, C, 1, move_to_delay) - //give up if we can't reach them after 10 seconds - GiveUp(C) - return - - //second, spin a sticky spiderweb on this tile - var/obj/effect/spider/stickyweb/W = locate() in get_turf(src) - if(!W) - busy = SPINNING_WEB - src.visible_message("\The [src] begins to secrete a sticky substance.") - stop_automated_movement = 1 - spawn(40) - if(busy == SPINNING_WEB) - new /obj/effect/spider/stickyweb(src.loc) - busy = 0 - stop_automated_movement = 0 - else - //third, lay an egg cluster there - var/obj/effect/spider/eggcluster/E = locate() in get_turf(src) - if(!E && fed > 0) - busy = LAYING_EGGS - src.visible_message("\The [src] begins to lay a cluster of eggs.") - stop_automated_movement = 1 - spawn(50) - if(busy == LAYING_EGGS) - E = locate() in get_turf(src) - if(!E) - new /obj/effect/spider/eggcluster(loc, src) - fed-- - busy = 0 - stop_automated_movement = 0 - else - //fourthly, cocoon any nearby items so those pesky pinkskins can't use them - for(var/obj/O in can_see) - - if(O.anchored) - continue - - if(istype(O, /obj/item) || istype(O, /obj/structure) || istype(O, /obj/machinery)) - cocoon_target = O - busy = MOVING_TO_TARGET - stop_automated_movement = 1 - walk_to(src, O, 1, move_to_delay) - //give up if we can't reach them after 10 seconds - GiveUp(O) - - else if(busy == MOVING_TO_TARGET && cocoon_target) - if(get_dist(src, cocoon_target) <= 1) - busy = SPINNING_COCOON - src.visible_message("\The [src] begins to secrete a sticky substance around \the [cocoon_target].") - stop_automated_movement = 1 - walk(src,0) - spawn(50) - if(busy == SPINNING_COCOON) - if(cocoon_target && istype(cocoon_target.loc, /turf) && get_dist(src,cocoon_target) <= 1) - var/obj/effect/spider/cocoon/C = new(cocoon_target.loc) - var/large_cocoon = 0 - C.pixel_x = cocoon_target.pixel_x - C.pixel_y = cocoon_target.pixel_y - for(var/mob/living/M in C.loc) - if(istype(M, /mob/living/simple_mob/hostile/giant_spider)) - continue - large_cocoon = 1 - fed++ - src.visible_message("\The [src] sticks a proboscis into \the [cocoon_target] and sucks a viscous substance out.") - M.forceMove(C) - C.pixel_x = M.pixel_x - C.pixel_y = M.pixel_y - break - for(var/obj/item/I in C.loc) - I.forceMove(C) - for(var/obj/structure/S in C.loc) - if(!S.anchored) - S.forceMove(C) - large_cocoon = 1 - for(var/obj/machinery/M in C.loc) - if(!M.anchored) - M.forceMove(C) - large_cocoon = 1 - if(large_cocoon) - C.icon_state = pick("cocoon_large1","cocoon_large2","cocoon_large3") - busy = 0 - stop_automated_movement = 0 - - else - busy = 0 - stop_automated_movement = 0 - - -#undef SPINNING_WEB -#undef LAYING_EGGS -#undef MOVING_TO_TARGET -#undef SPINNING_COCOON diff --git a/code/modules/mob/living/simple_animal/animals/giant_spider_vr.dm b/code/modules/mob/living/simple_animal/animals/giant_spider_vr.dm deleted file mode 100644 index 7497ae9e9c9..00000000000 --- a/code/modules/mob/living/simple_animal/animals/giant_spider_vr.dm +++ /dev/null @@ -1,23 +0,0 @@ -// Slightly placeholder, mostly to replace ion hivebots on V4 -/mob/living/simple_mob/hostile/giant_spider/ion - desc = "Furry and green, it makes you shudder to look at it. This one has brilliant green eyes and a hint of static discharge." - tt_desc = "X Brachypelma phorus ionus" - icon_state = "webslinger" - icon_living = "webslinger" - icon_dead = "webslinger_dead" - - maxHealth = 90 - health = 90 - - melee_damage_lower = 8 - melee_damage_upper = 15 - - ranged = 1 - projectilesound = 'sound/weapons/taser2.ogg' - projectiletype = /obj/item/projectile/ion/small - firing_lines = 1 - cooperative = 1 - - poison_chance = 15 - poison_per_bite = 2 - poison_type = "psilocybin" diff --git a/code/modules/mob/living/simple_animal/animals/goose.dm b/code/modules/mob/living/simple_animal/animals/goose.dm deleted file mode 100644 index 72744ad882d..00000000000 --- a/code/modules/mob/living/simple_animal/animals/goose.dm +++ /dev/null @@ -1,60 +0,0 @@ -/mob/living/simple_mob/hostile/goose //hey are these even in the game - name = "goose" - desc = "It looks pretty angry!" - tt_desc = "E Branta canadensis" //that iconstate is just a regular goose - icon_state = "goose" - icon_living = "goose" - icon_dead = "goose_dead" - - faction = "geese" - intelligence_level = SA_ANIMAL - - maxHealth = 15 - health = 15 - speed = 4 - - turns_per_move = 5 - - response_help = "pets the" - response_disarm = "gently pushes aside the" - response_harm = "hits the" - - harm_intent_damage = 5 - melee_damage_lower = 5 //they're meant to be annoying, not threatening. - melee_damage_upper = 5 //unless there's like a dozen of them, then you're screwed. - cooperative = 1 // mwahahahahahaaa // Vorestation Edit, temporary - attacktext = list("pecked") - attack_sound = 'sound/weapons/bite.ogg' - - //SPACE geese aren't affected by atmos. - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - minbodytemp = 0 - - has_langs = list("Bird") - speak_chance = 10 - speak = list("HONK!") - emote_hear = list("honks loudly!") - emote_see = list() - say_understood = list() - say_cannot = list() - say_maybe_target = list("Honk?") - say_got_target = list("HONK!!!") - reactions = list() - - - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat - -/mob/living/simple_mob/hostile/goose/set_target() - . = ..() - if(.) - custom_emote(1,"flaps and honks at [.]!") - -/mob/living/simple_mob/hostile/goose/Process_Spacemove(var/check_drift = 0) - return 1 // VOREStation Edit No drifting in space! diff --git a/code/modules/mob/living/simple_animal/animals/lizard.dm b/code/modules/mob/living/simple_animal/animals/lizard.dm deleted file mode 100644 index d9a1b1b8d05..00000000000 --- a/code/modules/mob/living/simple_animal/animals/lizard.dm +++ /dev/null @@ -1,24 +0,0 @@ -/mob/living/simple_mob/lizard - name = "Lizard" - desc = "A cute tiny lizard." - tt_desc = "E Anolis cuvieri" - icon = 'icons/mob/critter.dmi' - icon_state = "lizard" - icon_living = "lizard" - icon_dead = "lizard-dead" - intelligence_level = SA_ANIMAL - - health = 5 - maxHealth = 5 - mob_size = MOB_MINISCULE - - response_help = "pets" - response_disarm = "shoos" - response_harm = "stomps on" - - attacktext = list("bitten") - melee_damage_lower = 1 - melee_damage_upper = 2 - - speak_chance = 1 - speak_emote = list("hisses") diff --git a/code/modules/mob/living/simple_animal/animals/miscellaneous.dm b/code/modules/mob/living/simple_animal/animals/miscellaneous.dm deleted file mode 100644 index 306f6a3aadc..00000000000 --- a/code/modules/mob/living/simple_animal/animals/miscellaneous.dm +++ /dev/null @@ -1,21 +0,0 @@ -/mob/living/simple_mob/yithian - name = "yithian" - desc = "A friendly creature vaguely resembling an oversized snail without a shell." - tt_desc = "J Escargot escargot" // a product of Jade, which is a planet that totally exists - icon_state = "yithian" - icon_living = "yithian" - icon_dead = "yithian_dead" - icon = 'icons/jungle.dmi' - - faction = "yithian" - -/mob/living/simple_mob/tindalos - name = "tindalos" - desc = "It looks like a large, flightless grasshopper." - tt_desc = "J Locusta bruchus" - icon_state = "tindalos" - icon_living = "tindalos" - icon_dead = "tindalos_dead" - icon = 'icons/jungle.dmi' - - faction = "tindalos" \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/animals/mouse.dm b/code/modules/mob/living/simple_animal/animals/mouse.dm deleted file mode 100644 index d68d66b4983..00000000000 --- a/code/modules/mob/living/simple_animal/animals/mouse.dm +++ /dev/null @@ -1,137 +0,0 @@ -/mob/living/simple_mob/mouse - name = "mouse" - real_name = "mouse" - desc = "It's a small rodent." - tt_desc = "E Mus musculus" - icon_state = "mouse_gray" - item_state = "mouse_gray" - icon_living = "mouse_gray" - icon_dead = "mouse_gray_dead" - intelligence_level = SA_ANIMAL - - maxHealth = 5 - health = 5 - - turns_per_move = 5 - see_in_dark = 6 - universal_understand = 1 - - mob_size = MOB_SMALL - pass_flags = PASSTABLE -// can_pull_size = ITEMSIZE_TINY -// can_pull_mobs = MOB_PULL_NONE - layer = MOB_LAYER - density = 0 - - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "stamps on" - - min_oxy = 16 //Require atleast 16kPA oxygen - minbodytemp = 223 //Below -50 Degrees Celcius - maxbodytemp = 323 //Above 50 Degrees Celcius - - has_langs = list("Mouse") - speak_chance = 1 - speak = list("Squeek!","SQUEEK!","Squeek?") - speak_emote = list("squeeks","squeeks","squiks") - emote_hear = list("squeeks","squeaks","squiks") - emote_see = list("runs in a circle", "shakes", "scritches at something") - - holder_type = /obj/item/weapon/holder/mouse - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat - - var/body_color //brown, gray and white, leave blank for random - -/mob/living/simple_mob/mouse/Life() - . = ..() - if(!. || ai_inactive) return - - if(prob(speak_chance)) - for(var/mob/M in view()) - M << 'sound/effects/mouse_squeak.ogg' - - if(!resting && prob(0.5)) - lay_down() - speak_chance = 0 - //snuffles - - else if(resting) - if(prob(1)) - lay_down() - speak_chance = initial(speak_chance) - else if(prob(1)) - audible_emote("snuffles.") - -/mob/living/simple_mob/mouse/New() - ..() - - verbs += /mob/living/proc/ventcrawl - verbs += /mob/living/proc/hide - - if(name == initial(name)) - name = "[name] ([rand(1, 1000)])" - real_name = name - - if(!body_color) - body_color = pick( list("brown","gray","white") ) - icon_state = "mouse_[body_color]" - item_state = "mouse_[body_color]" - icon_living = "mouse_[body_color]" - icon_dead = "mouse_[body_color]_dead" - icon_rest = "mouse_[body_color]_sleep" - desc = "A small [body_color] rodent, often seen hiding in maintenance areas and making a nuisance of itself." - -/mob/living/simple_mob/mouse/proc/splat() - src.health = 0 - src.stat = DEAD - src.icon_dead = "mouse_[body_color]_splat" - src.icon_state = "mouse_[body_color]_splat" - layer = MOB_LAYER - if(client) - client.time_died_as_mouse = world.time - - -/mob/living/simple_mob/mouse/Crossed(AM as mob|obj) - if( ishuman(AM) ) - if(!stat) - var/mob/M = AM - M.visible_message("\icon[src] Squeek!") - M << 'sound/effects/mouse_squeak.ogg' - ..() - -/mob/living/simple_mob/mouse/death() - layer = MOB_LAYER - playsound(src, 'sound/effects/mouse_squeak_loud.ogg', 35, 1) - if(client) - client.time_died_as_mouse = world.time - ..() - -/* - * Mouse types - */ - -/mob/living/simple_mob/mouse/white - body_color = "white" - icon_state = "mouse_white" - -/mob/living/simple_mob/mouse/gray - body_color = "gray" - icon_state = "mouse_gray" - -/mob/living/simple_mob/mouse/brown - body_color = "brown" - icon_state = "mouse_brown" - -//TOM IS ALIVE! SQUEEEEEEEE~K :) -/mob/living/simple_mob/mouse/brown/Tom - name = "Tom" - desc = "Jerry the cat is not amused." - -/mob/living/simple_mob/mouse/brown/Tom/New() - ..() - // Change my name back, don't want to be named Tom (666) - name = initial(name) - -/mob/living/simple_mob/mouse/cannot_use_vents() - return diff --git a/code/modules/mob/living/simple_animal/animals/mouse_vr.dm b/code/modules/mob/living/simple_animal/animals/mouse_vr.dm deleted file mode 100644 index d3bdfbd1c60..00000000000 --- a/code/modules/mob/living/simple_animal/animals/mouse_vr.dm +++ /dev/null @@ -1,8 +0,0 @@ -/mob/living/simple_mob/mouse - no_vore = 1 //Mice can't eat others due to the amount of bugs caused by it. - - - - -/mob/living/simple_mob/mouse/attack_hand(mob/living/hander) - src.get_scooped(hander) //For one-click mouse scooping under any conditions. They knew what they were getting into! diff --git a/code/modules/mob/living/simple_animal/animals/parrot.dm b/code/modules/mob/living/simple_animal/animals/parrot.dm deleted file mode 100644 index 1c286228988..00000000000 --- a/code/modules/mob/living/simple_animal/animals/parrot.dm +++ /dev/null @@ -1,768 +0,0 @@ -/* Parrots! - * Contains - * Defines - * Inventory (headset stuff) - * Attack responces - * AI - * Procs / Verbs (usable by players) - * Sub-types - */ - -/* - * Defines - */ - -//Parrot is too snowflake for me to rewrite right now, someone should make it use the new -//simple_mob movement stuff. -Aro - -//Only a maximum of one action and one intent should be active at any given time. -//Actions -#define PARROT_PERCH 1 //Sitting/sleeping, not moving -#define PARROT_SWOOP 2 //Moving towards or away from a target -#define PARROT_WANDER 4 //Moving without a specific target in mind - -//Intents -#define PARROT_STEAL 8 //Flying towards a target to steal it/from it -#define PARROT_ATTACK 16 //Flying towards a target to attack it -#define PARROT_RETURN 32 //Flying towards its perch -#define PARROT_FLEE 64 //Flying away from its attacker - - -/mob/living/simple_mob/parrot - name = "parrot" - desc = "The parrot squawks, \"It's a parrot! BAWWK!\"" - tt_desc = "E Ara macao" - icon = 'icons/mob/animal.dmi' - icon_state = "parrot_fly" - icon_living = "parrot_fly" - icon_dead = "parrot_dead" - intelligence_level = SA_ANIMAL - - turns_per_move = 5 - pass_flags = PASSTABLE - mob_size = MOB_SMALL - - response_help = "pets" - response_disarm = "gently moves aside" - response_harm = "swats" - stop_automated_movement = 1 - universal_speak = 1 - - has_langs = list("Bird", "Galactic Common") - speak_chance = 2 - speak = list("Hi","Hello!","Cracker?","Bawk!") - speak_emote = list("squawks","says","yells") - emote_hear = list("squawks","bawks") - emote_see = list("flutters its wings") - - meat_type = /obj/item/weapon/reagent_containers/food/snacks/cracker - - hovering = TRUE - softfall = TRUE - parachuting = TRUE - - var/parrot_state = PARROT_WANDER //Hunt for a perch when created - var/parrot_sleep_max = 25 //The time the parrot sits while perched before looking around. Mosly a way to avoid the parrot's AI in life() being run every single tick. - var/parrot_sleep_dur = 25 //Same as above, this is the var that physically counts down - var/parrot_dam_zone = list(BP_TORSO, BP_HEAD, BP_L_ARM, BP_R_ARM, BP_L_LEG, BP_R_LEG) //For humans, select a bodypart to attack - - var/parrot_speed = 5 //"Delay in world ticks between movement." according to byond. Yeah, that's BS but it does directly affect movement. Higher number = slower. - var/parrot_been_shot = 0 //Parrots get a speed bonus after being shot. This will deincrement every Life() and at 0 the parrot will return to regular speed. - - var/list/speech_buffer = list() - var/list/available_channels = list() - - //Headset for Poly to yell at engineers :) - var/obj/item/device/radio/headset/ears = null - - //The thing the parrot is currently interested in. This gets used for items the parrot wants to pick up, mobs it wants to steal from, - //mobs it wants to attack or mobs that have attacked it - var/atom/movable/parrot_interest = null - - //Parrots will generally sit on their pertch unless something catches their eye. - //These vars store their preffered perch and if they dont have one, what they can use as a perch - var/obj/parrot_perch = null - var/obj/desired_perches = list(/obj/structure/frame, /obj/structure/displaycase, \ - /obj/structure/filingcabinet, /obj/machinery/teleport, \ - /obj/machinery/computer, /obj/machinery/clonepod, \ - /obj/machinery/dna_scannernew, /obj/machinery/telecomms, \ - /obj/machinery/nuclearbomb, /obj/machinery/particle_accelerator, \ - /obj/machinery/recharge_station, /obj/machinery/smartfridge, \ - /obj/machinery/suit_storage_unit) - - //Parrots are kleptomaniacs. This variable ... stores the item a parrot is holding. - var/obj/item/held_item = null - - -/mob/living/simple_mob/parrot/New() - ..() - if(!ears) - var/headset = pick(/obj/item/device/radio/headset/headset_sec, \ - /obj/item/device/radio/headset/headset_eng, \ - /obj/item/device/radio/headset/headset_med, \ - /obj/item/device/radio/headset/headset_sci, \ - /obj/item/device/radio/headset/headset_cargo) - ears = new headset(src) - - parrot_sleep_dur = parrot_sleep_max //In case someone decides to change the max without changing the duration var - - verbs.Add(/mob/living/simple_mob/parrot/proc/steal_from_ground, \ - /mob/living/simple_mob/parrot/proc/steal_from_mob, \ - /mob/living/simple_mob/parrot/verb/drop_held_item_player, \ - /mob/living/simple_mob/parrot/proc/perch_player) - - -/mob/living/simple_mob/parrot/death() - if(held_item) - held_item.forceMove(src.loc) - held_item = null - walk(src,0) - ..() - -/mob/living/simple_mob/parrot/Stat() - ..() - stat("Held Item", held_item) - -/* - * Inventory - */ -/mob/living/simple_mob/parrot/show_inv(mob/user as mob) - user.set_machine(src) - if(user.stat) return - - var/dat = "

Inventory of [name]

" - if(ears) - dat += "
Headset: [ears] (Remove)" - else - dat += "
Headset: Nothing" - - user << browse(dat, text("window=mob[];size=325x500", name)) - onclose(user, "mob[real_name]") - return - -/mob/living/simple_mob/parrot/Topic(href, href_list) - - //Can the usr physically do this? - if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) - return - - //Is the usr's mob type able to do this? - if(ishuman(usr) || issmall(usr) || isrobot(usr)) - - //Removing from inventory - if(href_list["remove_inv"]) - var/remove_from = href_list["remove_inv"] - switch(remove_from) - if("ears") - if(ears) - if(available_channels.len) - src.say("[pick(available_channels)] BAWWWWWK LEAVE THE HEADSET BAWKKKKK!") - else - src.say("BAWWWWWK LEAVE THE HEADSET BAWKKKKK!") - ears.forceMove(src.loc) - ears = null - for(var/possible_phrase in speak) - if(copytext(possible_phrase,1,3) in department_radio_keys) - possible_phrase = copytext(possible_phrase,3,length(possible_phrase)) - else - to_chat(usr, "There is nothing to remove from its [remove_from].") - return - - //Adding things to inventory - else if(href_list["add_inv"]) - var/add_to = href_list["add_inv"] - if(!usr.get_active_hand()) - to_chat(usr, "You have nothing in your hand to put on its [add_to].") - return - switch(add_to) - if("ears") - if(ears) - to_chat(usr, "It's already wearing something.") - return - else - var/obj/item/item_to_add = usr.get_active_hand() - if(!item_to_add) - return - - if( !istype(item_to_add, /obj/item/device/radio/headset) ) - to_chat(usr, "This object won't fit.") - return - - var/obj/item/device/radio/headset/headset_to_add = item_to_add - - usr.drop_item() - headset_to_add.forceMove(src) - src.ears = headset_to_add - to_chat(usr, "You fit the headset onto [src].") - - clearlist(available_channels) - for(var/ch in headset_to_add.channels) - switch(ch) - if("Engineering") - available_channels.Add(":e") - if("Command") - available_channels.Add(":c") - if("Security") - available_channels.Add(":s") - if("Science") - available_channels.Add(":n") - if("Medical") - available_channels.Add(":m") - if("Mining") - available_channels.Add(":d") - if("Cargo") - available_channels.Add(":q") - - if(headset_to_add.translate_binary) - available_channels.Add("#b") - else - ..() - - -/* - * Attack responces - */ -//Humans, monkeys, aliens -/mob/living/simple_mob/parrot/attack_hand(mob/living/carbon/M as mob) - ..() - if(client) return - if(!stat && M.a_intent == I_HURT) - - icon_state = "parrot_fly" //It is going to be flying regardless of whether it flees or attacks - - if(parrot_state == PARROT_PERCH) - parrot_sleep_dur = parrot_sleep_max //Reset it's sleep timer if it was perched - - parrot_interest = M - parrot_state = PARROT_SWOOP //The parrot just got hit, it WILL move, now to pick a direction.. - - if(M.health < 50) //Weakened mob? Fight back! - parrot_state |= PARROT_ATTACK - else - parrot_state |= PARROT_FLEE //Otherwise, fly like a bat out of hell! - drop_held_item(0) - return - -//Mobs with objects -/mob/living/simple_mob/parrot/attackby(var/obj/item/O as obj, var/mob/user as mob) - ..() - if(!stat && !client && !istype(O, /obj/item/stack/medical)) - if(O.force) - if(parrot_state == PARROT_PERCH) - parrot_sleep_dur = parrot_sleep_max //Reset it's sleep timer if it was perched - - parrot_interest = user - parrot_state = PARROT_SWOOP | PARROT_FLEE - icon_state = "parrot_fly" - drop_held_item(0) - return - -//Bullets -/mob/living/simple_mob/parrot/bullet_act(var/obj/item/projectile/Proj) - ..() - if(!stat && !client) - if(parrot_state == PARROT_PERCH) - parrot_sleep_dur = parrot_sleep_max //Reset it's sleep timer if it was perched - - parrot_interest = null - parrot_state = PARROT_WANDER //OWFUCK, Been shot! RUN LIKE HELL! - parrot_been_shot += 5 - icon_state = "parrot_fly" - drop_held_item(0) - return - - -/* - * AI - Not really intelligent, but I'm calling it AI anyway. - */ -/mob/living/simple_mob/parrot/Life() - ..() - - //Sprite and AI update for when a parrot gets pulled - if(pulledby && stat == CONSCIOUS) - icon_state = "parrot_fly" - if(!client) - parrot_state = PARROT_WANDER - return - - if(client || stat) - return //Lets not force players or dead/incap parrots to move - - if(!isturf(src.loc) || !canmove || buckled) - return //If it can't move, dont let it move. (The buckled check probably isn't necessary thanks to canmove) - - -//-----SPEECH - /* Parrot speech mimickry! - Phrases that the parrot hears in mob/living/say() get added to speach_buffer. - Every once in a while, the parrot picks one of the lines from the buffer and replaces an element of the 'speech' list. - Then it clears the buffer to make sure they dont magically remember something from hours ago. */ - if(speech_buffer.len && prob(10)) - if(speak.len) - speak.Remove(pick(speak)) - - speak.Add(pick(speech_buffer)) - clearlist(speech_buffer) - - -//-----SLEEPING - if(parrot_state == PARROT_PERCH) - if(parrot_perch && parrot_perch.loc != src.loc) //Make sure someone hasnt moved our perch on us - if(parrot_perch in view(src)) - parrot_state = PARROT_SWOOP | PARROT_RETURN - icon_state = "parrot_fly" - return - else - parrot_state = PARROT_WANDER - icon_state = "parrot_fly" - return - - if(--parrot_sleep_dur) //Zzz - return - - else - //This way we only call the stuff below once every [sleep_max] ticks. - parrot_sleep_dur = parrot_sleep_max - - //Cycle through message modes for the headset - if(speak.len) - var/list/newspeak = list() - - if(available_channels.len && src.ears) - for(var/possible_phrase in speak) - - //50/50 chance to not use the radio at all - var/useradio = 0 - if(prob(50)) - useradio = 1 - - if(copytext(possible_phrase,1,3) in department_radio_keys) - possible_phrase = "[useradio?pick(available_channels):""] [copytext(possible_phrase,3,length(possible_phrase)+1)]" //crop out the channel prefix - else - possible_phrase = "[useradio?pick(available_channels):""] [possible_phrase]" - - newspeak.Add(possible_phrase) - - else //If we have no headset or channels to use, dont try to use any! - for(var/possible_phrase in speak) - if(copytext(possible_phrase,1,3) in department_radio_keys) - possible_phrase = "[copytext(possible_phrase,3,length(possible_phrase)+1)]" //crop out the channel prefix - newspeak.Add(possible_phrase) - speak = newspeak - - //Search for item to steal - parrot_interest = search_for_item() - if(parrot_interest) - visible_emote("looks in [parrot_interest]'s direction and takes flight") - parrot_state = PARROT_SWOOP | PARROT_STEAL - icon_state = "parrot_fly" - return - -//-----WANDERING - This is basically a 'I dont know what to do yet' state - else if(parrot_state == PARROT_WANDER) - //Stop movement, we'll set it later - walk(src, 0) - parrot_interest = null - - //Wander around aimlessly. This will help keep the loops from searches down - //and possibly move the mob into a new are in view of something they can use - if(prob(90)) - step(src, pick(cardinal)) - return - - if(!held_item && !parrot_perch) //If we've got nothing to do.. look for something to do. - var/atom/movable/AM = search_for_perch_and_item() //This handles checking through lists so we know it's either a perch or stealable item - if(AM) - if(istype(AM, /obj/item) || isliving(AM)) //If stealable item - parrot_interest = AM - visible_emote("turns and flies towards [parrot_interest]") - parrot_state = PARROT_SWOOP | PARROT_STEAL - return - else //Else it's a perch - parrot_perch = AM - parrot_state = PARROT_SWOOP | PARROT_RETURN - return - return - - if(parrot_interest && parrot_interest in view(src)) - parrot_state = PARROT_SWOOP | PARROT_STEAL - return - - if(parrot_perch && parrot_perch in view(src)) - parrot_state = PARROT_SWOOP | PARROT_RETURN - return - - else //Have an item but no perch? Find one! - parrot_perch = search_for_perch() - if(parrot_perch) - parrot_state = PARROT_SWOOP | PARROT_RETURN - return -//-----STEALING - else if(parrot_state == (PARROT_SWOOP | PARROT_STEAL)) - walk(src,0) - if(!parrot_interest || held_item) - parrot_state = PARROT_SWOOP | PARROT_RETURN - return - - if(!(parrot_interest in view(src))) - parrot_state = PARROT_SWOOP | PARROT_RETURN - return - - if(in_range(src, parrot_interest)) - - if(isliving(parrot_interest)) - steal_from_mob() - - else //This should ensure that we only grab the item we want, and make sure it's not already collected on our perch - if(!parrot_perch || parrot_interest.loc != parrot_perch.loc) - held_item = parrot_interest - parrot_interest.forceMove(src) - visible_message("[src] grabs the [held_item]!", "You grab the [held_item]!", "You hear the sounds of wings flapping furiously.") - - parrot_interest = null - parrot_state = PARROT_SWOOP | PARROT_RETURN - return - - walk_to(src, parrot_interest, 1, parrot_speed) - return - -//-----RETURNING TO PERCH - else if(parrot_state == (PARROT_SWOOP | PARROT_RETURN)) - walk(src, 0) - if(!parrot_perch || !isturf(parrot_perch.loc)) //Make sure the perch exists and somehow isnt inside of something else. - parrot_perch = null - parrot_state = PARROT_WANDER - return - - if(in_range(src, parrot_perch)) - src.forceMove(parrot_perch.loc) - drop_held_item() - parrot_state = PARROT_PERCH - icon_state = "parrot_sit" - return - - walk_to(src, parrot_perch, 1, parrot_speed) - return - -//-----FLEEING - else if(parrot_state == (PARROT_SWOOP | PARROT_FLEE)) - walk(src,0) - if(!parrot_interest || !isliving(parrot_interest)) //Sanity - parrot_state = PARROT_WANDER - - walk_away(src, parrot_interest, 1, parrot_speed-parrot_been_shot) - parrot_been_shot-- - return - -//-----ATTACKING - else if(parrot_state == (PARROT_SWOOP | PARROT_ATTACK)) - - //If we're attacking a nothing, an object, a turf or a ghost for some stupid reason, switch to wander - if(!parrot_interest || !isliving(parrot_interest)) - parrot_interest = null - parrot_state = PARROT_WANDER - return - - var/mob/living/L = parrot_interest - - //If the mob is close enough to interact with - if(in_range(src, parrot_interest)) - - //If the mob we've been chasing/attacking dies or falls into crit, check for loot! - if(L.stat) - parrot_interest = null - if(!held_item) - held_item = steal_from_ground() - if(!held_item) - held_item = steal_from_mob() //Apparently it's possible for dead mobs to hang onto items in certain circumstances. - if(parrot_perch in view(src)) //If we have a home nearby, go to it, otherwise find a new home - parrot_state = PARROT_SWOOP | PARROT_RETURN - else - parrot_state = PARROT_WANDER - return - - //Time for the hurt to begin! - var/damage = rand(5,10) - - if(ishuman(parrot_interest)) - var/mob/living/carbon/human/H = parrot_interest - var/obj/item/organ/external/affecting = H.get_organ(ran_zone(pick(parrot_dam_zone))) - - H.apply_damage(damage, BRUTE, affecting, H.run_armor_check(affecting, "melee"), H.get_armor_soak(affecting, "melee"), sharp=1) - visible_emote(pick("pecks [H]'s [affecting].", "cuts [H]'s [affecting] with its talons.")) - - else - L.adjustBruteLoss(damage) - visible_emote(pick("pecks at [L].", "claws [L].")) - return - - //Otherwise, fly towards the mob! - else - walk_to(src, parrot_interest, 1, parrot_speed) - return -//-----STATE MISHAP - else //This should not happen. If it does lets reset everything and try again - walk(src,0) - parrot_interest = null - parrot_perch = null - drop_held_item() - parrot_state = PARROT_WANDER - return - -/* - * Procs - */ - -/mob/living/simple_mob/parrot/movement_delay() - if(client && stat == CONSCIOUS && parrot_state != "parrot_fly") - icon_state = "parrot_fly" - ..() - -/mob/living/simple_mob/parrot/proc/search_for_item() - for(var/atom/movable/AM in view(src)) - //Skip items we already stole or are wearing or are too big - if(parrot_perch && AM.loc == parrot_perch.loc || AM.loc == src) - continue - - if(istype(AM, /obj/item)) - var/obj/item/I = AM - if(I.w_class < ITEMSIZE_SMALL) - return I - - if(iscarbon(AM)) - var/mob/living/carbon/C = AM - if((C.l_hand && C.l_hand.w_class <= ITEMSIZE_SMALL) || (C.r_hand && C.r_hand.w_class <= ITEMSIZE_SMALL)) - return C - return null - -/mob/living/simple_mob/parrot/proc/search_for_perch() - for(var/obj/O in view(src)) - for(var/path in desired_perches) - if(istype(O, path)) - return O - return null - -//This proc was made to save on doing two 'in view' loops seperatly -/mob/living/simple_mob/parrot/proc/search_for_perch_and_item() - for(var/atom/movable/AM in view(src)) - for(var/perch_path in desired_perches) - if(istype(AM, perch_path)) - return AM - - //Skip items we already stole or are wearing or are too big - if(parrot_perch && AM.loc == parrot_perch.loc || AM.loc == src) - continue - - if(istype(AM, /obj/item)) - var/obj/item/I = AM - if(I.w_class <= ITEMSIZE_SMALL) - return I - - if(iscarbon(AM)) - var/mob/living/carbon/C = AM - if(C.l_hand && C.l_hand.w_class <= ITEMSIZE_SMALL || C.r_hand && C.r_hand.w_class <= ITEMSIZE_SMALL) - return C - return null - - -/* - * Verbs - These are actually procs, but can be used as verbs by player-controlled parrots. - */ -/mob/living/simple_mob/parrot/proc/steal_from_ground() - set name = "Steal from ground" - set category = "Parrot" - set desc = "Grabs a nearby item." - - if(stat) - return -1 - - if(held_item) - to_chat(src, "You are already holding the [held_item]") - return 1 - - for(var/obj/item/I in view(1,src)) - //Make sure we're not already holding it and it's small enough - if(I.loc != src && I.w_class <= ITEMSIZE_SMALL) - - //If we have a perch and the item is sitting on it, continue - if(!client && parrot_perch && I.loc == parrot_perch.loc) - continue - - held_item = I - I.forceMove(src) - visible_message("[src] grabs the [held_item]!", "You grab the [held_item]!", "You hear the sounds of wings flapping furiously.") - return held_item - - to_chat(src, "There is nothing of interest to take.") - return 0 - -/mob/living/simple_mob/parrot/proc/steal_from_mob() - set name = "Steal from mob" - set category = "Parrot" - set desc = "Steals an item right out of a person's hand!" - - if(stat) - return -1 - - if(held_item) - to_chat(src, "You are already holding the [held_item]") - return 1 - - var/obj/item/stolen_item = null - - for(var/mob/living/carbon/C in view(1,src)) - if(C.l_hand && C.l_hand.w_class <= ITEMSIZE_SMALL) - stolen_item = C.l_hand - - if(C.r_hand && C.r_hand.w_class <= ITEMSIZE_SMALL) - stolen_item = C.r_hand - - if(stolen_item) - C.remove_from_mob(stolen_item) - held_item = stolen_item - stolen_item.forceMove(src) - visible_message("[src] grabs the [held_item] out of [C]'s hand!", "You snag the [held_item] out of [C]'s hand!", "You hear the sounds of wings flapping furiously.") - return held_item - - to_chat(src, "There is nothing of interest to take.") - return 0 - -/mob/living/simple_mob/parrot/verb/drop_held_item_player() - set name = "Drop held item" - set category = "Parrot" - set desc = "Drop the item you're holding." - - if(stat) - return - - src.drop_held_item() - - return - -/mob/living/simple_mob/parrot/proc/drop_held_item(var/drop_gently = 1) - set name = "Drop held item" - set category = "Parrot" - set desc = "Drop the item you're holding." - - if(stat) - return -1 - - if(!held_item) - to_chat(usr, "You have nothing to drop!") - return 0 - - if(!drop_gently) - if(istype(held_item, /obj/item/weapon/grenade)) - var/obj/item/weapon/grenade/G = held_item - G.forceMove(src.loc) - G.detonate() - to_chat(src, "You let go of the [held_item]!") - held_item = null - return 1 - - to_chat(src, "You drop the [held_item].") - - held_item.forceMove(src.loc) - held_item = null - return 1 - -/mob/living/simple_mob/parrot/proc/perch_player() - set name = "Sit" - set category = "Parrot" - set desc = "Sit on a nice comfy perch." - - if(stat || !client) - return - - if(icon_state == "parrot_fly") - for(var/atom/movable/AM in view(src,1)) - for(var/perch_path in desired_perches) - if(istype(AM, perch_path)) - src.forceMove(AM.loc) - icon_state = "parrot_sit" - return - to_chat(src, "There is no perch nearby to sit on.") - return - -/* - * Sub-types - */ -/mob/living/simple_mob/parrot/Poly - name = "Poly" - desc = "Poly the Parrot. An expert on quantum cracker theory." - speak = list("Poly wanna cracker!", ":e Check the singlo, you chucklefucks!",":e Wire the solars, you lazy bums!",":e WHO TOOK THE DAMN HARDSUITS?",":e OH GOD ITS FREE CALL THE SHUTTLE") - -/mob/living/simple_mob/parrot/Poly/New() - ears = new /obj/item/device/radio/headset/headset_eng(src) - available_channels = list(":e") - ..() - -/mob/living/simple_mob/parrot/say(var/message) - - if(stat) - return - - var/verb = "says" - if(speak_emote.len) - verb = pick(speak_emote) - - - var/message_mode="" - if(copytext(message,1,2) == ";") - message_mode = "headset" - message = copytext(message,2) - - if(length(message) >= 2) - var/channel_prefix = copytext(message, 1 ,3) - message_mode = department_radio_keys[channel_prefix] - - if(copytext(message,1,2) == ":") - var/positioncut = 3 - message = trim(copytext(message,positioncut)) - - message = capitalize(trim_left(message)) - - if(message_mode) - if(message_mode in radiochannels) - if(ears && istype(ears,/obj/item/device/radio)) - ears.talk_into(src,sanitize(message), message_mode, verb, null) - - - ..(message) - - -/mob/living/simple_mob/parrot/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "",var/italics = 0, var/mob/speaker = null) - if(prob(50)) - parrot_hear(message) - ..(message,verb,language,alt_name,italics,speaker) - - - -/mob/living/simple_mob/parrot/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/part_c, var/mob/speaker = null, var/hard_to_hear = 0) - if(prob(50)) - parrot_hear("[pick(available_channels)] [message]") - ..(message,verb,language,part_a,part_b,speaker,hard_to_hear) - - -/mob/living/simple_mob/parrot/proc/parrot_hear(var/message="") - if(!message || stat) - return - speech_buffer.Add(message) - -/mob/living/simple_mob/parrot/attack_generic(var/mob/user, var/damage, var/attack_message) - - var/success = ..() - - if(client) - return success - - if(parrot_state == PARROT_PERCH) - parrot_sleep_dur = parrot_sleep_max //Reset it's sleep timer if it was perched - - if(!success) - return 0 - - parrot_interest = user - parrot_state = PARROT_SWOOP | PARROT_ATTACK //Attack other animals regardless - icon_state = "parrot_fly" - return success diff --git a/code/modules/mob/living/simple_animal/animals/penguin.dm b/code/modules/mob/living/simple_animal/animals/penguin.dm deleted file mode 100644 index 105d6e7c213..00000000000 --- a/code/modules/mob/living/simple_animal/animals/penguin.dm +++ /dev/null @@ -1,27 +0,0 @@ -/mob/living/simple_mob/penguin - name = "space penguin" - desc = "An ungainly, waddling, cute, and VERY well-dressed bird." - tt_desc = "E Aptenodytes forsteri" - icon_state = "penguin" - icon_living = "penguin" - icon_dead = "penguin_dead" - intelligence_level = SA_ANIMAL - - maxHealth = 20 - health = 20 - - turns_per_move = 5 - - response_help = "pets" - response_disarm = "pushes aside" - response_harm = "hits" - - harm_intent_damage = 5 - melee_damage_lower = 10 - melee_damage_upper = 15 - attacktext = list("pecked") - - has_langs = list("Bird") - speak_chance = 0 - - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat diff --git a/code/modules/mob/living/simple_animal/animals/pike_vr.dm b/code/modules/mob/living/simple_animal/animals/pike_vr.dm deleted file mode 100644 index b04b83c14f9..00000000000 --- a/code/modules/mob/living/simple_animal/animals/pike_vr.dm +++ /dev/null @@ -1,34 +0,0 @@ -/mob/living/simple_mob/hostile/carp/pike - name = "space pike" - desc = "A bigger, angrier cousin of the space carp." - icon = 'icons/mob/spaceshark.dmi' - icon_state = "shark" - icon_living = "shark" - icon_dead = "shark_dead" - - maxHealth = 150 - health = 150 - speed = 0 - move_to_delay = 2 - - turns_per_move = 2 - mob_size = MOB_LARGE - - harm_intent_damage = 5 - melee_damage_lower = 20 - melee_damage_upper = 25 - - meat_amount = 10 - - old_x = -16 - pixel_x = -16 - - vore_icons = 0 //No custom icons yet - -/mob/living/simple_mob/hostile/carp/pike/weak - maxHealth = 75 - health = 75 - -/mob/living/simple_mob/hostile/carp/strong - maxHealth = 50 - health = 50 diff --git a/code/modules/mob/living/simple_animal/animals/slime.dm b/code/modules/mob/living/simple_animal/animals/slime.dm deleted file mode 100644 index 7db2392808a..00000000000 --- a/code/modules/mob/living/simple_animal/animals/slime.dm +++ /dev/null @@ -1,70 +0,0 @@ -/mob/living/simple_mob/old_slime - name = "pet slime" - desc = "A lovable, domesticated slime." - tt_desc = "Amorphidae proteus" - icon = 'icons/mob/slimes.dmi' - icon_state = "grey baby slime" - icon_living = "grey baby slime" - icon_dead = "grey baby slime dead" - - maxHealth = 100 - health = 100 - - response_help = "pets" - response_disarm = "shoos" - response_harm = "stomps on" - - speak_chance = 1 - speak_emote = list("chirps") - emote_see = list("jiggles", "bounces in place") - - var/colour = "grey" - -/mob/living/simple_mob/old_slime/science - name = "Kendrick" - colour = "rainbow" - icon_state = "rainbow baby slime" - icon_living = "rainbow baby slime" - icon_dead = "rainbow baby slime dead" - -/mob/living/simple_animal/slime/science/Initialize() - . = ..() - overlays.Cut() - overlays += "aslime-:33" - -/mob/living/simple_mob/adultslime - name = "pet slime" - desc = "A lovable, domesticated slime." - icon = 'icons/mob/slimes.dmi' - icon_state = "grey adult slime" - icon_living = "grey adult slime" - icon_dead = "grey baby slime dead" - - maxHealth = 200 - health = 200 - - response_help = "pets" - response_disarm = "shoos" - response_harm = "stomps on" - - speak_chance = 1 - emote_see = list("jiggles", "bounces in place") - - var/colour = "grey" - -/mob/living/simple_mob/adultslime/New() - ..() - overlays += "aslime-:33" - -/mob/living/simple_mob/adultslime/death() - var/mob/living/simple_mob/old_slime/S1 = new /mob/living/simple_mob/old_slime (src.loc) - S1.icon_state = "[src.colour] baby slime" - S1.icon_living = "[src.colour] baby slime" - S1.icon_dead = "[src.colour] baby slime dead" - S1.colour = "[src.colour]" - var/mob/living/simple_mob/old_slime/S2 = new /mob/living/simple_mob/old_slime (src.loc) - S2.icon_state = "[src.colour] baby slime" - S2.icon_living = "[src.colour] baby slime" - S2.icon_dead = "[src.colour] baby slime dead" - S2.colour = "[src.colour]" - qdel(src) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/animals/snake_vr.dm b/code/modules/mob/living/simple_animal/animals/snake_vr.dm deleted file mode 100644 index b6f6618184d..00000000000 --- a/code/modules/mob/living/simple_animal/animals/snake_vr.dm +++ /dev/null @@ -1,104 +0,0 @@ -/mob/living/simple_mob/snake - name = "snake" - desc = "A big thick snake." - icon = 'icons/mob/snake_vr.dmi' - icon_state = "snake" - icon_living = "snake" - icon_dead = "snake_dead" - - maxHealth = 20 - health = 20 - - turns_per_move = 8 // SLOW-ASS MUTHAFUCKA - - response_help = "pets" - response_disarm = "shoos" - response_harm = "kicks" - - melee_damage_lower = 3 - melee_damage_upper = 5 - attacktext = list("bitten") - - speak_chance = 1 - speak_emote = list("hisses") - -//NOODLE IS HERE! SQUEEEEEEEE~ -/mob/living/simple_mob/snake/Noodle - name = "Noodle" - desc = "This snake is particularly chubby and demands nothing but the finest of treats." - var/turns_since_scan = 0 - var/obj/movement_target - -/mob/living/simple_mob/snake/Noodle/Life() //stolen from Ian in corgi.dm - if(!..()) - return 0 - - if(!stat && !resting && !buckled && !ai_inactive) - turns_since_scan++ - if(turns_since_scan > 5) - turns_since_scan = 0 - if(movement_target && !(isturf(movement_target.loc) || ishuman(movement_target.loc))) - movement_target = null - stop_automated_movement = 0 - if(!movement_target || !(movement_target.loc in oview(src, 5)) ) - movement_target = null - stop_automated_movement = 0 - walk(src,0) - for(var/obj/item/weapon/reagent_containers/food/snacks/snakesnack/S in oview(src,3)) - if(isturf(S.loc)) - movement_target = S - visible_emote("turns towards \the [movement_target] and slithers towards it.") - break - - if(movement_target) - stop_automated_movement = 1 - walk_to(src, movement_target, 0, 5) - spawn(10) - if(Adjacent(movement_target)) - visible_message("[src] swallows the [movement_target] whole!") - qdel(movement_target) - walk(src,0) - else if(ishuman(movement_target.loc) && prob(20)) - visible_emote("stares at the [movement_target] that [movement_target.loc] has with an unknowable reptilian gaze.") - -/mob/living/simple_mob/snake/Noodle/attackby(var/obj/item/O, var/mob/user) - if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/snakesnack)) - visible_message("[user] feeds \the [O] to [src].") - qdel(O) - else - return ..() - -//Special snek-snax for Noodle! -/obj/item/weapon/reagent_containers/food/snacks/snakesnack - name = "sugar mouse" - desc = "A little mouse treat made of coloured sugar. Noodle loves these!" - var/snack_colour - icon = 'icons/mob/snake_vr.dmi' - icon_state = "snack_yellow" - nutriment_amt = 1 - nutriment_desc = list("sugar" = 1) - -/obj/item/weapon/reagent_containers/food/snacks/snakesnack/New() - ..() - if(!snack_colour) - snack_colour = pick( list("yellow","green","pink","blue") ) - icon_state = "snack_[snack_colour]" - desc = "A little mouse treat made of coloured sugar. Noodle loves these! This one is [snack_colour]." - reagents.add_reagent("sugar", 2) - -/obj/item/weapon/storage/box/snakesnackbox - name = "box of Snake Snax" - desc = "A box containing Noodle's special sugermouse treats." - icon = 'icons/mob/snake_vr.dmi' - icon_state = "sneksnakbox" - storage_slots = 7 - -/obj/item/weapon/storage/box/snakesnackbox/New() - new /obj/item/weapon/reagent_containers/food/snacks/snakesnack(src) - new /obj/item/weapon/reagent_containers/food/snacks/snakesnack(src) - new /obj/item/weapon/reagent_containers/food/snacks/snakesnack(src) - new /obj/item/weapon/reagent_containers/food/snacks/snakesnack(src) - new /obj/item/weapon/reagent_containers/food/snacks/snakesnack(src) - new /obj/item/weapon/reagent_containers/food/snacks/snakesnack(src) - new /obj/item/weapon/reagent_containers/food/snacks/snakesnack(src) - ..() diff --git a/code/modules/mob/living/simple_animal/animals/spiderbot.dm b/code/modules/mob/living/simple_animal/animals/spiderbot.dm deleted file mode 100644 index 35b5a56926c..00000000000 --- a/code/modules/mob/living/simple_animal/animals/spiderbot.dm +++ /dev/null @@ -1,302 +0,0 @@ -/mob/living/simple_mob/spiderbot - name = "spider-bot" - desc = "A skittering robotic friend!" - tt_desc = "Maintenance Robot" - icon = 'icons/mob/robots.dmi' - icon_state = "spiderbot-chassis" - icon_living = "spiderbot-chassis" - icon_dead = "spiderbot-smashed" - intelligence_level = SA_HUMANOID // Because its piloted by players. - - health = 10 - maxHealth = 10 - - wander = 0 - speed = -1 //Spiderbots gotta go fast. - pass_flags = PASSTABLE - mob_size = MOB_SMALL - - response_help = "pets" - response_disarm = "shoos" - response_harm = "stomps on" - - melee_damage_lower = 1 - melee_damage_upper = 3 - attacktext = list("shocked") - - min_oxy = 0 - max_tox = 0 - max_co2 = 0 - minbodytemp = 0 - maxbodytemp = 500 - - speak_chance = 1 - speak_emote = list("beeps","clicks","chirps") - - var/obj/item/device/radio/borg/radio = null - var/mob/living/silicon/ai/connected_ai = null - var/obj/item/weapon/cell/cell = null - var/obj/machinery/camera/camera = null - var/obj/item/device/mmi/mmi = null - var/list/req_access = list(access_robotics) //Access needed to pop out the brain. - var/positronic - - can_enter_vent_with = list( - /obj/item/weapon/implant, - /obj/item/device/radio/borg, - /obj/item/weapon/holder, - /obj/machinery/camera, - /mob/living/simple_mob/animal/borer, - /obj/item/device/mmi, - ) - - var/emagged = 0 - var/obj/item/held_item = null //Storage for single item they can hold. - -/mob/living/simple_mob/spiderbot/New() - ..() - add_language(LANGUAGE_GALCOM) - default_language = all_languages[LANGUAGE_GALCOM] - verbs |= /mob/living/proc/ventcrawl - verbs |= /mob/living/proc/hide - -/mob/living/simple_mob/spiderbot/attackby(var/obj/item/O as obj, var/mob/user as mob) - - if(istype(O, /obj/item/device/mmi)) - var/obj/item/device/mmi/B = O - if(src.mmi) - user << "There's already a brain in [src]!" - return - if(!B.brainmob) - user << "Sticking an empty MMI into the frame would sort of defeat the purpose." - return - if(!B.brainmob.key) - var/ghost_can_reenter = 0 - if(B.brainmob.mind) - for(var/mob/observer/dead/G in player_list) - if(G.can_reenter_corpse && G.mind == B.brainmob.mind) - ghost_can_reenter = 1 - break - if(!ghost_can_reenter) - user << "[O] is completely unresponsive; there's no point." - return - - if(B.brainmob.stat == DEAD) - user << "[O] is dead. Sticking it into the frame would sort of defeat the purpose." - return - - if(jobban_isbanned(B.brainmob, "Cyborg")) - user << "\The [O] does not seem to fit." - return - - user << "You install \the [O] in \the [src]!" - - if(istype(O, /obj/item/device/mmi/digital)) - positronic = 1 - add_language("Robot Talk") - - user.drop_item() - src.mmi = O - src.transfer_personality(O) - - O.forceMove(src) - src.update_icon() - return 1 - - if (istype(O, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = O - if (WT.remove_fuel(0)) - if(health < getMaxHealth()) - health += pick(1,1,1,2,2,3) - if(health > getMaxHealth()) - health = getMaxHealth() - add_fingerprint(user) - src.visible_message("\The [user] has spot-welded some of the damage to \the [src]!") - else - user << "\The [src] is undamaged!" - else - user << "You need more welding fuel for this task!" - return - else if(istype(O, /obj/item/weapon/card/id)||istype(O, /obj/item/device/pda)) - if (!mmi) - user << "There's no reason to swipe your ID - \the [src] has no brain to remove." - return 0 - - var/obj/item/weapon/card/id/id_card - - if(istype(O, /obj/item/weapon/card/id)) - id_card = O - else - var/obj/item/device/pda/pda = O - id_card = pda.id - - if(access_robotics in id_card.access) - user << "You swipe your access card and pop the brain out of \the [src]." - eject_brain() - if(held_item) - held_item.forceMove(src.loc) - held_item = null - return 1 - else - user << "You swipe your card with no effect." - return 0 - - else - O.attack(src, user, user.zone_sel.selecting) - -/mob/living/simple_mob/spiderbot/emag_act(var/remaining_charges, var/mob/user) - if (emagged) - user << "[src] is already overloaded - better run." - return 0 - else - user << "You short out the security protocols and overload [src]'s cell, priming it to explode in a short time." - spawn(100) - to_chat(src, "Your cell seems to be outputting a lot of power...") - spawn(200) - to_chat(src, "Internal heat sensors are spiking! Something is badly wrong with your cell!") - spawn(300) src.explode() - -/mob/living/simple_mob/spiderbot/proc/transfer_personality(var/obj/item/device/mmi/M as obj) - - src.mind = M.brainmob.mind - src.mind.key = M.brainmob.key - src.ckey = M.brainmob.ckey - src.name = "spider-bot ([M.brainmob.name])" - src.languages = M.brainmob.languages - -/mob/living/simple_mob/spiderbot/proc/explode() //When emagged. - src.visible_message("\The [src] makes an odd warbling noise, fizzles, and explodes!") - explosion(get_turf(loc), -1, -1, 3, 5) - eject_brain() - death() - -/mob/living/simple_mob/spiderbot/update_icon() - if(mmi) - if(positronic) - icon_state = "spiderbot-chassis-posi" - icon_living = "spiderbot-chassis-posi" - else - icon_state = "spiderbot-chassis-mmi" - icon_living = "spiderbot-chassis-mmi" - else - icon_state = "spiderbot-chassis" - icon_living = "spiderbot-chassis" - -/mob/living/simple_mob/spiderbot/proc/eject_brain() - if(mmi) - var/turf/T = get_turf(loc) - if(T) - mmi.forceMove(T) - if(mind) mind.transfer_to(mmi.brainmob) - mmi = null - real_name = initial(real_name) - name = real_name - update_icon() - remove_language("Robot Talk") - positronic = null - -/mob/living/simple_mob/spiderbot/Destroy() - eject_brain() - ..() - -/mob/living/simple_mob/spiderbot/New() - - radio = new /obj/item/device/radio/borg(src) - camera = new /obj/machinery/camera(src) - camera.c_tag = "spiderbot-[real_name]" - camera.replace_networks(list("SS13")) - - ..() - -/mob/living/simple_mob/spiderbot/death() - - living_mob_list -= src - dead_mob_list += src - - if(camera) - camera.status = 0 - - held_item.forceMove(src.loc) - held_item = null - - gibs(loc, null, null, /obj/effect/gibspawner/robot) //TODO: use gib() or refactor spiderbots into synthetics. - qdel(src) - return - -//Cannibalized from the parrot mob. ~Zuhayr -/mob/living/simple_mob/spiderbot/verb/drop_held_item() - set name = "Drop held item" - set category = "Spiderbot" - set desc = "Drop the item you're holding." - - if(stat) - return - - if(!held_item) - usr << "You have nothing to drop!" - return 0 - - if(istype(held_item, /obj/item/weapon/grenade)) - visible_message("\The [src] launches \the [held_item]!", \ - "You launch \the [held_item]!", \ - "You hear a skittering noise and a thump!") - var/obj/item/weapon/grenade/G = held_item - G.forceMove(src.loc) - G.detonate() - held_item = null - return 1 - - visible_message("\The [src] drops \the [held_item].", \ - "You drop \the [held_item].", \ - "You hear a skittering noise and a soft thump.") - - held_item.forceMove(src.loc) - held_item = null - return 1 - - return - -/mob/living/simple_mob/spiderbot/verb/get_item() - set name = "Pick up item" - set category = "Spiderbot" - set desc = "Allows you to take a nearby small item." - - if(stat) - return -1 - - if(held_item) - to_chat(src, "You are already holding \the [held_item]") - return 1 - - var/list/items = list() - for(var/obj/item/I in view(1,src)) - if(I.loc != src && I.w_class <= ITEMSIZE_SMALL && I.Adjacent(src) ) - items.Add(I) - - var/obj/selection = input("Select an item.", "Pickup") in items - - if(selection) - for(var/obj/item/I in view(1, src)) - if(selection == I) - held_item = selection - selection.forceMove(src) - visible_message("\The [src] scoops up \the [held_item].", \ - "You grab \the [held_item].", \ - "You hear a skittering noise and a clink.") - return held_item - to_chat(src, "\The [selection] is too far away.") - return 0 - - to_chat(src, "There is nothing of interest to take.") - return 0 - -/mob/living/simple_mob/spiderbot/examine(mob/user) - ..(user) - if(src.held_item) - user << "It is carrying \icon[src.held_item] \a [src.held_item]." - -/mob/living/simple_mob/spiderbot/cannot_use_vents() - return - -/mob/living/simple_mob/spiderbot/binarycheck() - return positronic diff --git a/code/modules/mob/living/simple_animal/animals/tomato.dm b/code/modules/mob/living/simple_animal/animals/tomato.dm deleted file mode 100644 index 175875c4d2a..00000000000 --- a/code/modules/mob/living/simple_animal/animals/tomato.dm +++ /dev/null @@ -1,24 +0,0 @@ -/mob/living/simple_mob/hostile/tomato - name = "tomato" - desc = "It's a horrifyingly enormous beef tomato, and it's packing extra beef!" - tt_desc = "X Solanum abominable" - icon_state = "tomato" - icon_living = "tomato" - icon_dead = "tomato_dead" - intelligence_level = SA_PLANT - - faction = "plants" - maxHealth = 15 - health = 15 - turns_per_move = 5 - - response_help = "prods" - response_disarm = "pushes aside" - response_harm = "smacks" - - harm_intent_damage = 5 - melee_damage_upper = 15 - melee_damage_lower = 10 - attacktext = list("mauled") - - meat_type = /obj/item/weapon/reagent_containers/food/snacks/tomatomeat diff --git a/code/modules/mob/living/simple_animal/animals/tree.dm b/code/modules/mob/living/simple_animal/animals/tree.dm deleted file mode 100644 index 79e24c09f38..00000000000 --- a/code/modules/mob/living/simple_animal/animals/tree.dm +++ /dev/null @@ -1,60 +0,0 @@ -/mob/living/simple_mob/hostile/tree - name = "pine tree" - desc = "A pissed off tree-like alien. It seems annoyed with the festivities..." - tt_desc = "X Festivus tyrannus" - icon = 'icons/obj/flora/pinetrees.dmi' - icon_state = "pine_1" - icon_living = "pine_1" - icon_dead = "pine_1" - icon_gib = "pine_1" - intelligence_level = SA_PLANT - - faction = "carp" //Trees can be carp friends? - maxHealth = 250 - health = 250 - speed = -1 - - turns_per_move = 5 - - response_help = "brushes" - response_disarm = "pushes" - response_harm = "hits" - - harm_intent_damage = 5 - melee_damage_lower = 8 - melee_damage_upper = 12 - attacktext = list("bitten") - attack_sound = 'sound/weapons/bite.ogg' - - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - minbodytemp = 0 - - meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat - - pixel_x = -16 - -/mob/living/simple_mob/hostile/tree/FindTarget() - . = ..() - if(.) - audible_emote("growls at [.]") - -/mob/living/simple_mob/hostile/tree/PunchTarget() - . =..() - var/mob/living/L = . - if(istype(L)) - if(prob(15)) - L.Weaken(3) - L.visible_message("\the [src] knocks down \the [L]!") - -/mob/living/simple_mob/hostile/tree/death() - ..(null,"is hacked into pieces!") - playsound(loc, 'sound/effects/woodcutting.ogg', 100, 1) - new /obj/item/stack/material/wood(loc) - qdel(src) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/animals/worm.dm b/code/modules/mob/living/simple_animal/animals/worm.dm deleted file mode 100644 index 4b82fdee741..00000000000 --- a/code/modules/mob/living/simple_animal/animals/worm.dm +++ /dev/null @@ -1,199 +0,0 @@ -/mob/living/simple_mob/space_worm - name = "space worm segment" - desc = "A part of a space worm." - icon = 'icons/mob/animal.dmi' - icon_state = "spaceworm" - icon_living = "spaceworm" - icon_dead = "spacewormdead" - intelligence_level = SA_ANIMAL - - - maxHealth = 30 - health = 30 - speed = -1 - - status_flags = 0 - universal_speak = 1 - stop_automated_movement = 1 - wander = 0 - animate_movement = SYNC_STEPS - - response_help = "touches" - response_disarm = "flails at" - response_harm = "punches the" - - harm_intent_damage = 2 - - minbodytemp = 0 - maxbodytemp = 350 - min_oxy = 0 - max_co2 = 0 - max_tox = 0 - - environment_smash = 2 - - speak_emote = list("transmits") //not supposed to be used under AI control - emote_hear = list("transmits") //I'm just adding it so it doesn't runtime if controlled by player who speaks - - var/mob/living/simple_mob/space_worm/previous //next/previous segments, correspondingly - var/mob/living/simple_mob/space_worm/next //head is the nextest segment - - var/stomachProcessProbability = 50 - var/digestionProbability = 20 - var/flatPlasmaValue = 5 //flat plasma amount given for non-items - - var/atom/currentlyEating //what the worm is currently eating - var/eatingDuration = 0 //how long he's been eating it for - - head - name = "space worm head" - icon_state = "spacewormhead" - icon_living = "spacewormhead" - icon_dead = "spacewormdead" - - maxHealth = 20 - health = 20 - - melee_damage_lower = 10 - melee_damage_upper = 15 - attacktext = list("bitten") - - animate_movement = SLIDE_STEPS - - New(var/location, var/segments = 6) - ..() - - var/mob/living/simple_mob/space_worm/current = src - - for(var/i = 1 to segments) - var/mob/living/simple_mob/space_worm/newSegment = new /mob/living/simple_mob/space_worm(loc) - current.Attach(newSegment) - current = newSegment - - update_icon() - if(stat == CONSCIOUS || stat == UNCONSCIOUS) - icon_state = "spacewormhead[previous?1:0]" - if(previous) - set_dir(get_dir(previous,src)) - else - icon_state = "spacewormheaddead" - - Life() - ..() - - if(next && !(next in view(src,1))) - Detach() - - if(stat == DEAD) //dead chunks fall off and die immediately - if(previous) - previous.Detach() - if(next) - Detach(1) - - if(prob(stomachProcessProbability)) - ProcessStomach() - - update_icon() - - return - - Destroy() //if a chunk a destroyed, make a new worm out of the split halves - if(previous) - previous.Detach() - ..() - - Move() - var/attachementNextPosition = loc - if(..()) - if(previous) - previous.Move(attachementNextPosition) - update_icon() - - Bump(atom/obstacle) - if(currentlyEating != obstacle) - currentlyEating = obstacle - eatingDuration = 0 - - if(!AttemptToEat(obstacle)) - eatingDuration++ - else - currentlyEating = null - eatingDuration = 0 - - return - - update_icon() //only for the sake of consistency with the other update icon procs - if(stat == CONSCIOUS || stat == UNCONSCIOUS) - if(previous) //midsection - icon_state = "spaceworm[get_dir(src,previous) | get_dir(src,next)]" //see 3 lines below - else //tail - icon_state = "spacewormtail" - set_dir(get_dir(src,next)) //next will always be present since it's not a head and if it's dead, it goes in the other if branch - else - icon_state = "spacewormdead" - - return - - proc/AttemptToEat(var/atom/target) - if(istype(target,/turf/simulated/wall)) - var/turf/simulated/wall/W = target - if((!W.reinf_material && eatingDuration >= 100) || eatingDuration >= 200) //need 20 ticks to eat an rwall, 10 for a regular one - W.dismantle_wall() - return 1 - else if(istype(target,/atom/movable)) - if(istype(target,/mob) || eatingDuration >= 50) //5 ticks to eat stuff like airlocks - var/atom/movable/objectOrMob = target - contents += objectOrMob - return 1 - - return 0 - - proc/Attach(var/mob/living/simple_mob/space_worm/attachement) - if(!attachement) - return - - previous = attachement - attachement.next = src - - return - - proc/Detach(die = 0) - var/mob/living/simple_mob/space_worm/newHead = new /mob/living/simple_mob/space_worm/head(loc,0) - var/mob/living/simple_mob/space_worm/newHeadPrevious = previous - - previous = null //so that no extra heads are spawned - - newHead.Attach(newHeadPrevious) - - if(die) - newHead.death() - - qdel(src) - - proc/ProcessStomach() - for(var/atom/movable/stomachContent in contents) - if(prob(digestionProbability)) - if(istype(stomachContent,/obj/item/stack)) //converts to plasma, keeping the stack value - if(!istype(stomachContent,/obj/item/stack/material/phoron)) - var/obj/item/stack/oldStack = stomachContent - new /obj/item/stack/material/phoron(src, oldStack.get_amount()) - qdel(oldStack) - continue - else if(istype(stomachContent,/obj/item)) //converts to plasma, keeping the w_class - var/obj/item/oldItem = stomachContent - new /obj/item/stack/material/phoron(src, oldItem.w_class) - qdel(oldItem) - continue - else - new /obj/item/stack/material/phoron(src, flatPlasmaValue) //just flat amount - qdel(stomachContent) - continue - - if(previous) - for(var/atom/movable/stomachContent in contents) //transfer it along the digestive tract - previous.contents += stomachContent - else - for(var/atom/movable/stomachContent in contents) //or poop it out - loc.contents += stomachContent - - return diff --git a/code/modules/mob/living/simple_animal/humanoids/clown.dm b/code/modules/mob/living/simple_animal/humanoids/clown.dm deleted file mode 100644 index 9641611c339..00000000000 --- a/code/modules/mob/living/simple_animal/humanoids/clown.dm +++ /dev/null @@ -1,49 +0,0 @@ -/mob/living/simple_mob/hostile/clown - name = "clown" - desc = "A denizen of clown planet" - tt_desc = "E Homo sapiens corydon" //this is an actual clown, as opposed to someone dressed up as one - icon_state = "clown" - icon_living = "clown" - icon_dead = "clown_dead" - icon_gib = "clown_gib" - intelligence_level = SA_HUMANOID - - faction = "clown" - maxHealth = 75 - health = 75 - speed = -1 - move_to_delay = 2 - - run_at_them = 0 - cooperative = 1 - - turns_per_move = 5 - stop_when_pulled = 0 - - response_help = "pokes" - response_disarm = "gently pushes aside" - response_harm = "hits" - - harm_intent_damage = 8 - melee_damage_lower = 10 - melee_damage_upper = 10 - attacktext = list("attacked") - attack_sound = 'sound/items/bikehorn.ogg' - - min_oxy = 5 - max_oxy = 0 - min_tox = 0 - max_tox = 1 - min_co2 = 0 - max_co2 = 5 - min_n2 = 0 - max_n2 = 0 - minbodytemp = 270 - maxbodytemp = 370 - heat_damage_per_tick = 15 //amount of damage applied if animal's body temperature is higher than maxbodytemp - cold_damage_per_tick = 10 //same as heat_damage_per_tick, only if the bodytemperature it's lower than minbodytemp - unsuitable_atoms_damage = 10 - - speak_chance = 1 - speak = list("HONK", "Honk!", "Welcome to clown planet!") - emote_see = list("honks") diff --git a/code/modules/mob/living/simple_animal/humanoids/mechamobs.dm b/code/modules/mob/living/simple_animal/humanoids/mechamobs.dm deleted file mode 100644 index 9e1398884fa..00000000000 --- a/code/modules/mob/living/simple_animal/humanoids/mechamobs.dm +++ /dev/null @@ -1,123 +0,0 @@ -/mob/living/simple_mob/hostile/mecha - name = "mercenary gygax" - desc = "Well that's forboding." - icon = 'icons/mecha/mecha.dmi' - icon_state = "darkgygax" - icon_living = "darkgygax" - icon_dead = "darkgygax-broken" - intelligence_level = SA_HUMANOID // Piloted by a human. - - faction = "syndicate" - maxHealth = 300 - health = 300 - speed = 7 - move_to_delay = 8 - - run_at_them = 0 - cooperative = 1 - investigates = 1 - firing_lines = 1 - - turns_per_move = 5 - stop_when_pulled = 0 - - response_help = "taps on" - response_disarm = "knocks on" - response_harm = "uselessly hits" - - harm_intent_damage = 0 - melee_damage_lower = 35 - melee_damage_upper = 35 - attacktext = list("slashed") - attack_sound = 'sound/weapons/bladeslice.ogg' - - armor = list(melee = 40, bullet = 40, laser = 50, energy = 45, bomb = 20, bio = 100, rad = 100) // As close to the actual Dark Gygax as possible - - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - unsuitable_atoms_damage = 0 - - ranged = 1 - rapid = 1 - projectiletype = /obj/item/projectile/beam/midlaser - projectilesound = 'sound/weapons/laser.ogg' - - speak_chance = 1 - speak = list("Know what we need? More meatshields.", - "Glad I finally got a mech.", - "I'll stomp those NanoTrasen dogs into paste.", - "Glad I didn't become a line chef.", - "This anti-fog visor is nice...", - "Did I refill the air tank?") - emote_hear = list("humms ominously","whirrs softly","grinds a gear") - emote_see = list("looks around the area","turns from side to side") - say_understood = list() - say_cannot = list() - say_maybe_target = list("Just my sensors?","Detecting something?","Is that...?","What was that?") - say_got_target = list("ENGAGING!!!","CONTACT!!!","TARGET SPOTTED!","FOUND ONE!") - reactions = list() - - var/datum/effect/effect/system/spark_spread/sparks - var/wreckage = /obj/effect/decal/mecha_wreckage/gygax/dark - -/mob/living/simple_mob/hostile/mecha/New() - ..() - sparks = new (src) - sparks.set_up(3, 1, src) - -/mob/living/simple_mob/hostile/mecha/Destroy() - qdel(sparks) - ..() - -/mob/living/simple_mob/hostile/mecha/Life() - . = ..() - if(!.) return - if((health < getMaxHealth()*0.3) && prob(10)) - sparks.start() - -/mob/living/simple_mob/hostile/mecha/bullet_act() - ..() - sparks.start() - -/mob/living/simple_mob/hostile/mecha/death() - ..(0,"explodes!") - sparks.start() - explosion(get_turf(src), 0, 0, 1, 3) - qdel(src) - new /obj/effect/decal/mecha_wreckage/gygax/dark(get_turf(src)) - -/mob/living/simple_mob/hostile/mecha/Move() - ..() - playsound(src,'sound/mecha/mechstep.ogg',40,1) - -// This is a PoI mob, not the normal, floaty drones that hang out around windows -/mob/living/simple_mob/hostile/mecha/malf_drone - name = "autonomous mechanized drone" - desc = "It appears to be an exosuit, piloted by a drone intelligence. It looks scary." - intelligence_level = SA_ROBOTIC - faction = "malf_drone" - speak_chance = 1 - speak = list( - "Resuming task: Protect area.", - "No threats found.", - "Error: No targets found." - ) - emote_hear = list("humms ominously", "whirrs softly", "grinds a gear") - emote_see = list("looks around the area", "turns from side to side") - say_understood = list("Affirmative.", "Positive.") - say_cannot = list("Denied.", "Negative.") - say_maybe_target = list("Possible threat detected. Investigating.", "Motion detected.", "Investigating.") - say_got_target = list("Threat detected.", "New task: Remove threat.", "Threat removal engaged.", "Engaging target.") - returns_home = TRUE - -/mob/living/simple_mob/hostile/mecha/malf_drone/isSynthetic() - return TRUE - -/mob/living/simple_mob/hostile/mecha/malf_drone/speech_bubble_appearance() - return "synthetic_evil" \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/humanoids/pirate.dm b/code/modules/mob/living/simple_animal/humanoids/pirate.dm deleted file mode 100644 index 4e833b90ac2..00000000000 --- a/code/modules/mob/living/simple_animal/humanoids/pirate.dm +++ /dev/null @@ -1,72 +0,0 @@ -/mob/living/simple_mob/hostile/pirate - name = "Pirate" - desc = "Does what he wants cause a pirate is free." - tt_desc = "E Homo sapiens" - icon_state = "piratemelee" - icon_living = "piratemelee" - icon_dead = "piratemelee_dead" - intelligence_level = SA_HUMANOID - - faction = "pirate" - maxHealth = 100 - health = 100 - speed = 4 - - run_at_them = 0 - cooperative = 1 - investigates = 1 - firing_lines = 1 - returns_home = 1 - reacts = 1 - - turns_per_move = 5 - stop_when_pulled = 0 - - response_help = "pushes" - response_disarm = "shoves" - response_harm = "hits" - - harm_intent_damage = 5 - melee_damage_lower = 30 - melee_damage_upper = 30 - attack_armor_pen = 50 - attack_sharp = 1 - attack_edge = 1 - - attacktext = list("slashed") - attack_sound = 'sound/weapons/bladeslice.ogg' - - min_oxy = 5 - max_oxy = 0 - min_tox = 0 - max_tox = 1 - min_co2 = 0 - max_co2 = 5 - min_n2 = 0 - max_n2 = 0 - unsuitable_atoms_damage = 15 - - loot_list = list(/obj/item/weapon/melee/energy/sword/pirate = 100) - - var/corpse = /obj/effect/landmark/mobcorpse/pirate - -/mob/living/simple_mob/hostile/pirate/ranged - name = "Pirate Gunner" - icon_state = "pirateranged" - icon_living = "pirateranged" - icon_dead = "piratemelee_dead" - - ranged = 1 - projectiletype = /obj/item/projectile/beam - projectilesound = 'sound/weapons/laser.ogg' - - loot_list = list(/obj/item/weapon/gun/energy/laser = 100) - - corpse = /obj/effect/landmark/mobcorpse/pirate/ranged - -/mob/living/simple_mob/hostile/pirate/death() - ..() - if(corpse) - new corpse (src.loc) - qdel(src) - return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/humanoids/russian.dm b/code/modules/mob/living/simple_animal/humanoids/russian.dm deleted file mode 100644 index e13b5ed9686..00000000000 --- a/code/modules/mob/living/simple_animal/humanoids/russian.dm +++ /dev/null @@ -1,68 +0,0 @@ -/mob/living/simple_mob/hostile/russian - name = "russian" - desc = "For the Motherland!" - tt_desc = "E Homo sapiens" - icon_state = "russianmelee" - icon_living = "russianmelee" - icon_dead = "russianmelee_dead" - icon_gib = "syndicate_gib" - intelligence_level = SA_HUMANOID - - faction = "russian" - maxHealth = 100 - health = 100 - speed = 4 - - run_at_them = 0 - cooperative = 1 - investigates = 1 - firing_lines = 1 - returns_home = 1 - reacts = 1 - - turns_per_move = 5 - stop_when_pulled = 0 - status_flags = CANPUSH - - response_help = "pokes" - response_disarm = "shoves" - response_harm = "hits" - - harm_intent_damage = 5 - melee_damage_lower = 15 - melee_damage_upper = 15 - attacktext = list("punched") - - min_oxy = 5 - max_oxy = 0 - min_tox = 0 - max_tox = 1 - min_co2 = 0 - max_co2 = 5 - min_n2 = 0 - max_n2 = 0 - unsuitable_atoms_damage = 15 - - loot_list = list(/obj/item/weapon/material/knife = 100) - - var/corpse = /obj/effect/landmark/mobcorpse/russian - -/mob/living/simple_mob/hostile/russian/ranged - icon_state = "russianranged" - icon_living = "russianranged" - - ranged = 1 - projectiletype = /obj/item/projectile/bullet - casingtype = /obj/item/ammo_casing/spent - projectilesound = 'sound/weapons/Gunshot.ogg' - - loot_list = list(/obj/item/weapon/gun/projectile/revolver/mateba = 100) - - corpse = /obj/effect/landmark/mobcorpse/russian/ranged - -/mob/living/simple_mob/hostile/russian/death() - ..() - if(corpse) - new corpse (src.loc) - qdel(src) - return diff --git a/code/modules/mob/living/simple_animal/humanoids/syndicate.dm b/code/modules/mob/living/simple_animal/humanoids/syndicate.dm deleted file mode 100644 index 2cc300b82cc..00000000000 --- a/code/modules/mob/living/simple_animal/humanoids/syndicate.dm +++ /dev/null @@ -1,266 +0,0 @@ -/mob/living/simple_mob/hostile/syndicate - name = "mercenary" - desc = "Death to the Company." - tt_desc = "E Homo sapiens" - icon_state = "syndicate" - icon_living = "syndicate" - icon_dead = "syndicate_dead" - icon_gib = "syndicate_gib" - intelligence_level = SA_HUMANOID - - faction = "syndicate" - maxHealth = 100 - health = 100 - speed = 4 - - run_at_them = 0 - cooperative = 1 - investigates = 1 - firing_lines = 1 - returns_home = 1 - reacts = 1 - - turns_per_move = 5 - stop_when_pulled = 0 - status_flags = CANPUSH - - response_help = "pokes" - response_disarm = "shoves" - response_harm = "hits" - - harm_intent_damage = 5 - melee_damage_lower = 15 //Tac Knife damage - melee_damage_upper = 15 - environment_smash = 1 - attack_sharp = 1 - attack_edge = 1 - attacktext = list("slashed", "stabbed") - - armor = list(melee = 40, bullet = 30, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 100) // Same armor values as the vest they drop, plus simple mob immunities - - min_oxy = 5 - max_oxy = 0 - min_tox = 0 - max_tox = 1 - min_co2 = 0 - max_co2 = 5 - min_n2 = 0 - max_n2 = 0 - unsuitable_atoms_damage = 15 - - speak_chance = 1 - speak = list("Fuckin' NT, man.", - "When are we gonna get out of this chicken-shit outfit?", - "Wish I had better equipment...", - "I knew I should have been a line chef...", - "Fuckin' helmet keeps fogging up.", - "Anyone else smell that?") - emote_hear = list("sniffs","coughs","taps his foot") - emote_see = list("looks around","checks his equipment") - say_understood = list() - say_cannot = list() - say_maybe_target = list("What's that?","Is someone there?","Is that...?","Hmm?") - say_got_target = list("ENGAGING!!!","CONTACT!!!","TARGET SPOTTED!","FOUND ONE!") - reactions = list("Hey guys, you ready?" = "Fuck yeah!") - - var/corpse = /obj/effect/landmark/mobcorpse/syndicatesoldier - -/mob/living/simple_mob/hostile/syndicate/death() - if(corpse) - ..() - new corpse (src.loc) - else - ..(0,"explodes!") - new /obj/effect/gibspawner/human(src.loc) - explosion(get_turf(src), -1, 0, 1, 3) - qdel(src) - return - -///////////////Sword and shield//////////// - -/mob/living/simple_mob/hostile/syndicate/melee - icon_state = "syndicatemelee" - icon_living = "syndicatemelee" - - melee_damage_lower = 30 - melee_damage_upper = 30 - attack_armor_pen = 50 - attack_sharp = 1 - attack_edge = 1 - attacktext = list("slashed") - - status_flags = 0 - - loot_list = list(/obj/item/weapon/melee/energy/sword/red = 100, /obj/item/weapon/shield/energy = 100) - -/mob/living/simple_mob/hostile/syndicate/melee/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(O.force) - if(prob(20)) - visible_message("\The [src] blocks \the [O] with its shield!") - if(user) - react_to_attack(user) - return - else - ..() - else - usr << "This weapon is ineffective, it does no damage." - visible_message("\The [user] gently taps [src] with \the [O].") - -/mob/living/simple_mob/hostile/syndicate/melee/bullet_act(var/obj/item/projectile/Proj) - if(!Proj) return - if(prob(35)) - visible_message("[src] blocks [Proj] with its shield!") - if(Proj.firer) - react_to_attack(Proj.firer) - return - else - ..() - -/mob/living/simple_mob/hostile/syndicate/melee/space - name = "syndicate commando" - icon_state = "syndicatemeleespace" - icon_living = "syndicatemeleespace" - - speed = 0 - - armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 100) // Same armor as their voidsuit - - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - minbodytemp = 0 - - corpse = /obj/effect/landmark/mobcorpse/syndicatecommando - -/mob/living/simple_mob/hostile/syndicate/melee/space/Process_Spacemove(var/check_drift = 0) - return - -/mob/living/simple_mob/hostile/syndicate/ranged - icon_state = "syndicateranged" - icon_living = "syndicateranged" - - ranged = 1 - rapid = 1 - projectiletype = /obj/item/projectile/bullet/pistol/medium -// casingtype = /obj/item/ammo_casing/spent //Makes infinite stacks of bullets when put in PoIs. - projectilesound = 'sound/weapons/Gunshot_light.ogg' - - loot_list = list(/obj/item/weapon/gun/projectile/automatic/c20r = 100) - -/mob/living/simple_mob/hostile/syndicate/ranged/laser - icon_state = "syndicateranged_laser" - icon_living = "syndicateranged_laser" - rapid = 0 - projectiletype = /obj/item/projectile/beam/midlaser - projectilesound = 'sound/weapons/Laser.ogg' - - loot_list = list(/obj/item/weapon/gun/energy/laser = 100) - -/mob/living/simple_mob/hostile/syndicate/ranged/ionrifle - icon_state = "syndicateranged_ionrifle" - icon_living = "syndicateranged_ionrifle" - rapid = 0 - projectiletype = /obj/item/projectile/ion - projectilesound = 'sound/weapons/Laser.ogg' - - loot_list = list(/obj/item/weapon/gun/energy/ionrifle = 100) - -/mob/living/simple_mob/hostile/syndicate/ranged/space - name = "space mercenary" //VOREStation Edit - icon_state = "syndicaterangedpsace" - icon_living = "syndicaterangedpsace" - - speed = 0 - - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - minbodytemp = 0 - maxbodytemp = 900 //VOREStation edit - We'll pretend they have good suits - - corpse = /obj/effect/landmark/mobcorpse/syndicatecommando - -/mob/living/simple_mob/hostile/syndicate/ranged/space/Process_Spacemove(var/check_drift = 0) - return - -/////////////////////////////////////////////// -// POI Mobs -// Don't leave corpses, to help balance loot. -/////////////////////////////////////////////// - -/mob/living/simple_mob/hostile/syndicate/poi - loot_list = list() - corpse = null - -/mob/living/simple_mob/hostile/syndicate/melee/poi - loot_list = list() - corpse = null - -/mob/living/simple_mob/hostile/syndicate/melee/space/poi - loot_list = list() - corpse = null - -/mob/living/simple_mob/hostile/syndicate/ranged/poi - loot_list = list() - corpse = null - -/mob/living/simple_mob/hostile/syndicate/ranged/laser/poi - loot_list = list() - corpse = null - -/mob/living/simple_mob/hostile/syndicate/ranged/ionrifle/poi - loot_list = list() - corpse = null - -/mob/living/simple_mob/hostile/syndicate/ranged/space/poi - loot_list = list() - corpse = null - - -//Viscerators - -/mob/living/simple_mob/hostile/viscerator - name = "viscerator" - desc = "A small, twin-bladed machine capable of inflicting very deadly lacerations." - icon = 'icons/mob/critter.dmi' - icon_state = "viscerator_attack" - icon_living = "viscerator_attack" - intelligence_level = SA_ROBOTIC - hovering = TRUE - - faction = "syndicate" - maxHealth = 15 - health = 15 - - pass_flags = PASSTABLE - - melee_damage_lower = 15 - melee_damage_upper = 15 - attack_sharp = 1 - attack_edge = 1 - attack_sound = 'sound/weapons/bladeslice.ogg' - attacktext = list("cut") - - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - minbodytemp = 0 - -/mob/living/simple_mob/hostile/viscerator/death() - ..(null,"is smashed into pieces!") - qdel(src) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm deleted file mode 100644 index d143f37ae38..00000000000 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ /dev/null @@ -1,1759 +0,0 @@ -#define ai_log(M,V) if(debug_ai) ai_log_output(M,V) - -//Talky things -#define try_say_list(L) if(L.len) say(pick(L)) - -/mob/living/simple_mob - name = "animal" - desc = "" - icon = 'icons/mob/animal.dmi' - health = 20 - maxHealth = 20 - - mob_bump_flag = simple_mob - mob_swap_flags = MONKEY|SLIME|HUMAN - mob_push_flags = MONKEY|SLIME|HUMAN - - var/tt_desc = "Uncataloged Life Form" //Tooltip description - - //Settings for played mobs - var/show_stat_health = 1 // Does the percentage health show in the stat panel for the mob - var/ai_inactive = 0 // Set to 1 to turn off most AI actions - var/has_hands = 0 // Set to 1 to enable the use of hands and the hands hud - var/humanoid_hands = 0 // Can a player in this mob use things like guns or AI cards? - var/hand_form = "hands" // Used in IsHumanoidToolUser. 'Your X are not fit-'. - var/list/hud_gears // Slots to show on the hud (typically none) - var/ui_icons // Icon file path to use for the HUD, otherwise generic icons are used - var/r_hand_sprite // If they have hands, - var/l_hand_sprite // they could use some icons. - var/player_msg // Message to print to players about 'how' to play this mob on login. - - //Mob icon/appearance settings - var/icon_living = "" // The iconstate if we're alive, required - var/icon_dead = "" // The iconstate if we're dead, required - var/icon_gib = "generic_gib" // The iconstate for being gibbed, optional. Defaults to a generic gib animation. - var/icon_rest = null // The iconstate for resting, optional - var/image/modifier_overlay = null // Holds overlays from modifiers. - attack_icon = 'icons/effects/effects.dmi' //Just the default, played like the weapon attack anim - attack_icon_state = "slash" //Just the default - - //Mob talking settings - universal_speak = 0 // Can all mobs in the entire universe understand this one? - var/has_langs = list(LANGUAGE_GALCOM)// Text name of their language if they speak something other than galcom. They speak the first one. - var/speak_chance = 0 // Probability that I talk (this is 'X in 200' chance since even 1/100 is pretty noisy) - var/reacts = 0 // Reacts to some things being said - var/list/speak = list() // Things I might say if I talk - var/list/emote_hear = list() // Hearable emotes I might perform - var/list/emote_see = list() // Unlike speak_emote, the list of things in this variable only show by themselves with no spoken text. IE: Ian barks, Ian yaps - var/list/say_understood = list()// List of things to say when accepting an order - var/list/say_cannot = list() // List of things to say when they cannot comply - var/list/say_maybe_target = list()// List of things to say when they spot something barely - var/list/say_got_target = list()// List of things to say when they engage a target - var/list/reactions = list() // List of "string" = "reaction" and things they hear will be searched for string. - - //Mob movement settings - var/wander = 1 // Does the mob wander around when idle? - var/wander_distance = 3 // How far the mob will wander before going home (assuming they are allowed to do that) - var/returns_home = 0 // Mob knows how to return to wherever it started - var/turns_per_move = 1 // How many life() cycles to wait between each wander mov? - var/stop_when_pulled = 1 // When set to 1 this stops the animal from moving when someone is pulling it. - var/follow_dist = 2 // Distance the mob tries to follow a friend - var/obstacles = list() // Things this mob refuses to move through - var/speed = 0 // Higher speed is slower, negative speed is faster. - var/obj/item/weapon/card/id/myid// An ID card if they have one to give them access to stuff. - var/turf/home_turf // Set when they spawned, they try to come back here sometimes. - - //Mob interaction - var/response_help = "tries to help" // If clicked on help intent - var/response_disarm = "tries to disarm" // If clicked on disarm intent - var/response_harm = "tries to hurt" // If clicked on harm intent - var/harm_intent_damage = 3 // How much an unarmed harm click does to this mob. - var/meat_amount = 0 // How much meat to drop from this mob when butchered - var/obj/meat_type // The meat object to drop - var/list/loot_list = list() // The list of lootable objects to drop, with "/path = prob%" structure - var/recruitable = 0 // Mob can be bossed around - var/recruit_cmd_str = "Hey," // The thing you prefix commands with when bossing them around - var/intelligence_level = SA_ANIMAL// How 'smart' the mob is ICly, used to deliniate between animal, robot, and humanoid SAs. - - //Mob environment settings - var/minbodytemp = 250 // Minimum "okay" temperature in kelvin - var/maxbodytemp = 350 // Maximum of above - var/heat_damage_per_tick = 3 // Amount of damage applied if animal's body temperature is higher than maxbodytemp - var/cold_damage_per_tick = 2 // Same as heat_damage_per_tick, only if the bodytemperature it's lower than minbodytemp - var/fire_alert = 0 // 0 = fine, 1 = hot, 2 = cold - - var/min_oxy = 5 // Oxygen in moles, minimum, 0 is 'no minimum' - var/max_oxy = 0 // Oxygen in moles, maximum, 0 is 'no maximum' - var/min_tox = 0 // Phoron min - var/max_tox = 1 // Phoron max - var/min_co2 = 0 // CO2 min - var/max_co2 = 5 // CO2 max - var/min_n2 = 0 // N2 min - var/max_n2 = 0 // N2 max - var/unsuitable_atoms_damage = 2 // This damage is taken when atmos doesn't fit all the requirements above - - //Hostility settings - var/hostile = 0 // Do I even attack? - var/retaliate = 0 // I respond to damage against specific targets. - var/view_range = 7 // Scan for targets in this range. - var/specific_targets = 0 // Only use Found() targets, ignore others. - var/investigates = 0 // Do I investigate if I saw someone briefly? - var/attack_same = 0 // Do I attack members of my own faction? - var/cooperative = 0 // Do I ask allies to help me? - var/assist_distance = 25 // Radius in which I'll ask my comrades for help. - var/supernatural = 0 // If the mob is supernatural (used in null-rod stuff for banishing?) - var/grab_resist = 75 // Chance of me resisting a grab attempt. - var/taser_kill = 1 // Is the mob weak to tasers - - //Attack ranged settings - var/ranged = 0 // Do I attack at range? - var/shoot_range = 7 // How far away do I start shooting from? - var/rapid = 0 // Three-round-burst fire mode - var/firing_lines = 0 // Avoids shooting allies - var/projectiletype // The projectiles I shoot - var/projectilesound // The sound I make when I do it - var/casingtype // What to make the hugely laggy casings pile out of - - //Mob melee settings - var/melee_damage_lower = 2 // Lower bound of randomized melee damage - var/melee_damage_upper = 6 // Upper bound of randomized melee damage - var/list/attacktext = list("attacked") // "You are [attacktext] by the mob!" - var/list/friendly = list("nuzzles") // "The mob [friendly] the person." - var/attack_sound = null // Sound to play when I attack - var/environment_smash = 0 // How much environment damage do I do when I hit stuff? - var/melee_miss_chance = 15 // percent chance to miss a melee attack. - var/melee_attack_minDelay = 5 // How long between attacks at least - var/melee_attack_maxDelay = 10 // How long between attacks at most - var/attack_armor_type = "melee" // What armor does this check? - var/attack_armor_pen = 0 // How much armor pen this attack has. - var/attack_sharp = 0 // Is the attack sharp? - var/attack_edge = 0 // Does the attack have an edge? - - //Special attacks - var/spattack_prob = 0 // Chance of the mob doing a special attack (0 for never) - var/spattack_min_range = 0 // Min range to perform the special attacks from - var/spattack_max_range = 0 // Max range to perform special attacks from - - //Attack movement settings - var/run_at_them = 1 // Don't use A* pathfinding, use walk_to - var/move_to_delay = 4 // Delay for the automated movement (deciseconds) - var/destroy_surroundings = 1 // Should I smash things to get to my target? - var/astar_adjacent_proc = /turf/proc/CardinalTurfsWithAccess // Proc to use when A* pathfinding. Default makes them bound to cardinals. - - //Damage resistances - var/shock_resistance = 0 // Siemens modifier, directly subtracted from 1. Value of 0.4 means 0.6 siemens on shocks. - var/resistance = 0 // Damage reduction for all types - var/list/armor = list( // Values for normal getarmor() checks - "melee" = 0, - "bullet" = 0, - "laser" = 0, - "energy" = 0, - "bomb" = 0, - "bio" = 100, - "rad" = 100) - - //Scary debug things - var/debug_ai = 0 // Logging level for this mob (1,2,3) - var/path_display = 0 // Will display the path in green when pathing - var/path_icon = 'icons/misc/debug_group.dmi' // What icon to use for the overlay - var/path_icon_state = "red" // What state to use for the overlay - var/icon/path_overlay // A reference to restart - - ////// These are used for inter-proc communications so don't edit them manually ////// - var/stance = STANCE_IDLE // Used to determine behavior - var/stop_automated_movement = 0 // Use this to temporarely stop random movement or to if you write special movement code for animals. - var/lifes_since_move = 0 // A counter for how many life() cycles since move - var/shuttletarget = null // Shuttle's here, time to get to it - var/enroute = 0 // If the shuttle is en-route - var/purge = 0 // A counter used for null-rod stuff - var/mob/living/target_mob // Who I'm trying to attack - var/mob/living/follow_mob // Who I'm recruited by - var/mob/living/list/friends = list() // People who are immune to my wrath, for now - var/mob/living/simple_mob/list/faction_friends = list() // Other simple mobs I am friends with - var/turf/list/walk_list = list()// List of turfs to walk through to get somewhere - var/astarpathing = 0 // Am I currently pathing to somewhere? - var/stance_changed = 0 // When our stance last changed (world.time) - var/last_target_time = 0 // When we last set our target, to prevent juggles - var/last_follow_time = 0 // When did we last get asked to follow someone? - var/last_helpask_time = 0 // When did we last call for help? - var/follow_until_time = 0 // Give up following when we reach this time (0 = never) - var/annoyed = 0 // Do people keep distract-kiting us? - ////// ////// ////// - var/life_disabled = 0 //VOREStation Edit -- For performance reasons - -/mob/living/simple_mob/New() - ..() - verbs -= /mob/verb/observe - home_turf = get_turf(src) - path_overlay = new(path_icon,path_icon_state) - move_to_delay = max(2,move_to_delay) //Protection against people coding things incorrectly and A* pathing 100% of the time - maxHealth = health - - for(var/L in has_langs) - languages |= all_languages[L] - if(languages.len) - default_language = languages[1] - - if(cooperative) - var/mob/living/simple_mob/first_friend - for(var/mob/living/simple_mob/M in living_mob_list) - if(M.faction == src.faction) - first_friend = M - break - if(first_friend) - faction_friends = first_friend.faction_friends - faction_friends |= src - else - faction_friends |= src - -/mob/living/simple_mob/Destroy() - home_turf = null - path_overlay = null - default_language = null - target_mob = null - follow_mob = null - if(myid) - qdel(myid) - myid = null - - if(faction_friends.len) //This list is shared amongst the faction - faction_friends -= src - - friends.Cut() //This one is not - walk_list.Cut() - languages.Cut() - return ..() - -//Client attached -/mob/living/simple_mob/Login() - . = ..() - ai_inactive = 1 - handle_stance(STANCE_IDLE) - LoseTarget() - to_chat(src,"Mob AI disabled while you are controlling the mob.
You are \the [src]. [player_msg]") - -//Client detatched -/mob/living/simple_mob/Logout() - spawn(15 SECONDS) //15 seconds to get back into the mob before it goes wild - if(src && !src.client) - ai_inactive = initial(ai_inactive) //So if they never have an AI, they stay that way. - ..() - -//For debug purposes! -/mob/living/simple_mob/proc/ai_log_output(var/msg = "missing message", var/ver = 1) - if(ver <= debug_ai) - log_debug("SA-AI: ([src]:[x],[y],[z])(@[world.time]): [msg] ") - -//Should we be dead? -/mob/living/simple_mob/updatehealth() - health = getMaxHealth() - getToxLoss() - getFireLoss() - getBruteLoss() - - //Alive, becoming dead - if((stat < DEAD) && (health <= 0)) - death() - - //Overhealth - if(health > getMaxHealth()) - health = getMaxHealth() - - //Update our hud if we have one - if(healths) - if(stat != DEAD) - var/heal_per = (health / getMaxHealth()) * 100 - switch(heal_per) - if(100 to INFINITY) - healths.icon_state = "health0" - if(80 to 100) - healths.icon_state = "health1" - if(60 to 80) - healths.icon_state = "health2" - if(40 to 60) - healths.icon_state = "health3" - if(20 to 40) - healths.icon_state = "health4" - if(0 to 20) - healths.icon_state = "health5" - else - healths.icon_state = "health6" - else - healths.icon_state = "health7" - - //Updates the nutrition while we're here - if(nutrition_icon) - var/food_per = (nutrition / initial(nutrition)) * 100 - switch(food_per) - if(90 to INFINITY) - nutrition_icon.icon_state = "nutrition0" - if(75 to 90) - nutrition_icon.icon_state = "nutrition1" - if(50 to 75) - nutrition_icon.icon_state = "nutrition2" - if(25 to 50) - nutrition_icon.icon_state = "nutrition3" - if(0 to 25) - nutrition_icon.icon_state = "nutrition4" - -/mob/living/simple_mob/update_icon() - . = ..() - var/mutable_appearance/ma = new(src) - ma.layer = layer - ma.plane = plane - - ma.overlays = list(modifier_overlay) - - //Awake and normal - if((stat == CONSCIOUS) && (!icon_rest || !resting || !incapacitated(INCAPACITATION_DISABLED) )) - ma.icon_state = icon_living - - //Dead - else if(stat >= DEAD) - ma.icon_state = icon_dead - - //Resting or KO'd - else if(((stat == UNCONSCIOUS) || resting || incapacitated(INCAPACITATION_DISABLED) ) && icon_rest) - ma.icon_state = icon_rest - - //Backup - else - ma.icon_state = initial(icon_state) - - //VOREStation edit start - var/vore_icon_state = update_vore_icon() - if(vore_icon_state) - ma.icon_state = vore_icon_state - //VOREStation edit end - - if(has_hands) - if(r_hand_sprite) - ma.overlays += r_hand_sprite - if(l_hand_sprite) - ma.overlays += l_hand_sprite - - appearance = ma - -// If your simple mob's update_icon() call calls overlays.Cut(), this needs to be called after this, or manually apply modifier_overly to overlays. -/mob/living/simple_mob/update_modifier_visuals() - var/image/effects = null - if(modifier_overlay) - overlays -= modifier_overlay - modifier_overlay.overlays.Cut() - effects = modifier_overlay - else - effects = new() - - for(var/datum/modifier/M in modifiers) - if(M.mob_overlay_state) - var/image/I = image("icon" = 'icons/mob/modifier_effects.dmi', "icon_state" = M.mob_overlay_state) - I.appearance_flags = RESET_COLOR // So colored mobs don't affect the overlay. - effects.overlays += I - - modifier_overlay = effects - overlays += modifier_overlay - - -/mob/living/simple_mob/Life() - - //VOREStation Edit - if(life_disabled) - return 0 - //VOREStation Edit End - - ..() - - //Health - updatehealth() - if(stat >= DEAD) - return 0 - - handle_stunned() - handle_weakened() - handle_paralysed() - handle_supernatural() - handle_atmos() //Atmos - - ai_log("Life() - stance=[stance] ai_inactive=[ai_inactive]", 4) - - //AI Actions - if(!ai_inactive) - //Stanceyness - handle_stance() - - //Movement - if(!stop_automated_movement && wander && !anchored) //Allowed to move? - handle_wander_movement() - - //Speaking - if(speak_chance && stance == STANCE_IDLE) // Allowed to chatter? - handle_idle_speaking() - - //Resisting out buckles - if(stance != STANCE_IDLE && incapacitated(INCAPACITATION_BUCKLED_PARTIALLY)) - handle_resist() - - //Resisting out of closets - if(istype(loc,/obj/structure/closet)) - var/obj/structure/closet/C = loc - if(C.sealed) - handle_resist() - else - C.open() - - return 1 - -// Resists out of things. -// Sometimes there are times you want SAs to be buckled to something, so override this for when that is needed. -/mob/living/simple_mob/proc/handle_resist() - resist() - -// Peforms the random walk wandering -/mob/living/simple_mob/proc/handle_wander_movement() - if(isturf(src.loc) && !resting && !buckled && canmove) //Physically capable of moving? - lifes_since_move++ //Increment turns since move (turns are life() cycles) - if(lifes_since_move >= turns_per_move) - if(!(stop_when_pulled && pulledby)) //Some animals don't move when pulled - var/moving_to = 0 // otherwise it always picks 4, fuck if I know. Did I mention fuck BYOND - moving_to = pick(cardinal) - dir = moving_to //How about we turn them the direction they are moving, yay. - var/turf/T = get_step(src,moving_to) - if(avoid_turf(T)) - return - Move(T) - lifes_since_move = 0 - -// Checks to see if mob doesn't like this kind of turf -/mob/living/simple_mob/proc/avoid_turf(var/turf/turf) - if(!turf) - return TRUE //Avoid the nothing, yes - - if(istype(turf,/turf/simulated/sky)) - return TRUE //Mobs aren't that stupid, probably - - return FALSE //Override it on stuff to adjust - -// Handles random chatter, called from Life() when stance = STANCE_IDLE -/mob/living/simple_mob/proc/handle_idle_speaking() - if(rand(0,200) < speak_chance) - if(speak && speak.len) - if((emote_hear && emote_hear.len) || (emote_see && emote_see.len)) - var/length = speak.len - if(emote_hear && emote_hear.len) - length += emote_hear.len - if(emote_see && emote_see.len) - length += emote_see.len - var/randomValue = rand(1,length) - if(randomValue <= speak.len) - try_say_list(speak) - else - randomValue -= speak.len - if(emote_see && randomValue <= emote_see.len) - visible_emote("[pick(emote_see)].") - else - audible_emote("[pick(emote_hear)].") - else - try_say_list(speak) - else - if(!(emote_hear && emote_hear.len) && (emote_see && emote_see.len)) - visible_emote("[pick(emote_see)].") - if((emote_hear && emote_hear.len) && !(emote_see && emote_see.len)) - audible_emote("[pick(emote_hear)].") - if((emote_hear && emote_hear.len) && (emote_see && emote_see.len)) - var/length = emote_hear.len + emote_see.len - var/pick = rand(1,length) - if(pick <= emote_see.len) - visible_emote("[pick(emote_see)].") - else - audible_emote("[pick(emote_hear)].") - -// Handle interacting with and taking damage from atmos -// TODO - Refactor this to use handle_environment() like a good /mob/living -/mob/living/simple_mob/proc/handle_atmos() - var/atmos_unsuitable = 0 - - var/atom/A = src.loc - - if(istype(A,/turf)) - var/turf/T = A - - var/datum/gas_mixture/Environment = T.return_air() - - if(Environment) - - if( abs(Environment.temperature - bodytemperature) > 40 ) - bodytemperature += ((Environment.temperature - bodytemperature) / 5) - - if(min_oxy) - if(Environment.gas["oxygen"] < min_oxy) - atmos_unsuitable = 1 - if(max_oxy) - if(Environment.gas["oxygen"] > max_oxy) - atmos_unsuitable = 1 - if(min_tox) - if(Environment.gas["phoron"] < min_tox) - atmos_unsuitable = 2 - if(max_tox) - if(Environment.gas["phoron"] > max_tox) - atmos_unsuitable = 2 - if(min_n2) - if(Environment.gas["nitrogen"] < min_n2) - atmos_unsuitable = 1 - if(max_n2) - if(Environment.gas["nitrogen"] > max_n2) - atmos_unsuitable = 1 - if(min_co2) - if(Environment.gas["carbon_dioxide"] < min_co2) - atmos_unsuitable = 1 - if(max_co2) - if(Environment.gas["carbon_dioxide"] > max_co2) - atmos_unsuitable = 1 - - //Atmos effect - if(bodytemperature < minbodytemp) - fire_alert = 2 - adjustBruteLoss(cold_damage_per_tick) - if(fire) - fire.icon_state = "fire1" - else if(bodytemperature > maxbodytemp) - fire_alert = 1 - adjustBruteLoss(heat_damage_per_tick) - if(fire) - fire.icon_state = "fire2" - else - fire_alert = 0 - if(fire) - fire.icon_state = "fire0" - - if(atmos_unsuitable) - adjustBruteLoss(unsuitable_atoms_damage) - if(oxygen) - oxygen.icon_state = "oxy1" - else if(oxygen) - if(oxygen) - oxygen.icon_state = "oxy0" - -// For setting the stance WITHOUT processing it -/mob/living/simple_mob/proc/set_stance(var/new_stance) - stance = new_stance - stance_changed = world.time - ai_log("set_stance() changing to [new_stance]",2) - -// For proccessing the current stance, or setting and processing a new one -/mob/living/simple_mob/proc/handle_stance(var/new_stance) - if(ai_inactive) - stance = STANCE_IDLE - return - - if(new_stance) - set_stance(new_stance) - - switch(stance) - if(STANCE_IDLE) - target_mob = null - a_intent = I_HELP - annoyed = max(0,annoyed--) - - //Yes I'm breaking this into two if()'s for ease of reading - //If we ARE ALLOWED TO - if(returns_home && home_turf && !astarpathing && (world.time - stance_changed) > 10 SECONDS) - if(get_dist(src,home_turf) > wander_distance) - move_to_delay = initial(move_to_delay)*2 //Walk back. - GoHome() - else - stop_automated_movement = 0 - - //Search for targets while idle - if(hostile || specific_targets) - FindTarget() - if(STANCE_FOLLOW) - annoyed = 15 - FollowTarget() - if(follow_until_time && world.time > follow_until_time) - LoseFollow() - return - if(hostile || specific_targets) - FindTarget() - if(STANCE_ATTACK) - annoyed = 50 - a_intent = I_HURT - RequestHelp() - MoveToTarget() - if(STANCE_ATTACKING) - annoyed = 50 - AttackTarget() - -/mob/living/simple_mob/proc/handle_supernatural() - if(purge) - purge -= 1 - -/mob/living/simple_mob/gib() - ..(icon_gib,1,icon) // we need to specify where the gib animation is stored - -/mob/living/simple_mob/emote(var/act, var/type, var/desc) - if(act) - ..(act, type, desc) - -/mob/living/simple_mob/bullet_act(var/obj/item/projectile/Proj) - ai_log("bullet_act() I was shot by: [Proj.firer]",2) - - /* VOREStation Edit - Ace doesn't like bonus SA damage. - //Projectiles with bonus SA damage - if(!Proj.nodamage) - if(!Proj.SA_vulnerability || Proj.SA_vulnerability == intelligence_level) - Proj.damage += Proj.SA_bonus_damage - */ // VOREStation Edit End - . = ..() - - if(Proj.firer) - react_to_attack(Proj.firer) - -// When someone clicks us with an empty hand -/mob/living/simple_mob/attack_hand(mob/living/carbon/human/M as mob) - ..() - - switch(M.a_intent) - - if(I_HELP) - if (health > 0) - M.visible_message("[M] [response_help] \the [src].") - - if(I_DISARM) - M.visible_message("[M] [response_disarm] \the [src].") - M.do_attack_animation(src) - //TODO: Push the mob away or something - - if(I_GRAB) - if (M == src) - return - if (!(status_flags & CANPUSH)) - return - if(!incapacitated(INCAPACITATION_ALL) && (stance != STANCE_IDLE) && prob(grab_resist)) - M.visible_message("[M] tries to grab [src] but fails!") - return - - var/obj/item/weapon/grab/G = new /obj/item/weapon/grab(M, src) - - M.put_in_active_hand(G) - - G.synch() - G.affecting = src - LAssailant = M - - M.visible_message("[M] has grabbed [src] passively!") - M.do_attack_animation(src) - ai_log("attack_hand() I was grabbed by: [M]",2) - react_to_attack(M) - - if(I_HURT) - var/armor = run_armor_check(def_zone = null, attack_flag = "melee") - apply_damage(damage = harm_intent_damage, damagetype = BURN, def_zone = null, blocked = armor, blocked = resistance, used_weapon = null, sharp = FALSE, edge = FALSE) - M.visible_message("[M] [response_harm] \the [src]!") - M.do_attack_animation(src) - ai_log("attack_hand() I was hit by: [M]",2) - react_to_attack(M) - - return - -// When somoene clicks us with an item in hand -/mob/living/simple_mob/attackby(var/obj/item/O, var/mob/user) - if(istype(O, /obj/item/stack/medical)) - if(stat != DEAD) - var/obj/item/stack/medical/MED = O - if(health < getMaxHealth()) - if(MED.amount >= 1) - adjustBruteLoss(-MED.heal_brute) - MED.amount -= 1 - if(MED.amount <= 0) - qdel(MED) - for(var/mob/M in viewers(src, null)) - if ((M.client && !( M.blinded ))) - M.show_message("[user] applies the [MED] on [src].") - else - var/datum/gender/T = gender_datums[src.get_visible_gender()] - user << "\The [src] is dead, medical items won't bring [T.him] back to life." // the gender lookup is somewhat overkill, but it functions identically to the obsolete gender macros and future-proofs this code - if(meat_type && (stat == DEAD)) //if the animal has a meat, and if it is dead. - if(istype(O, /obj/item/weapon/material/knife) || istype(O, /obj/item/weapon/material/knife/butch)) - harvest(user) - else - ai_log("attackby() I was weapon'd by: [user]",2) - if(O.force) - react_to_attack(user) - - return ..() - -/mob/living/simple_mob/hit_with_weapon(obj/item/O, mob/living/user, var/effective_force, var/hit_zone) - - //Animals can't be stunned(?) - if(O.damtype == HALLOSS) - effective_force = 0 - if(supernatural && istype(O,/obj/item/weapon/nullrod)) - effective_force *= 2 - purge = 3 - if(O.force <= resistance) - to_chat(user,"This weapon is ineffective, it does no damage.") - return 2 - - ai_log("hit_with_weapon() I was h_w_weapon'd by: [user]",2) - react_to_attack(user) - - . = ..() - -// When someone throws something at us -/mob/living/simple_mob/hitby(atom/movable/AM) - ..() - if(AM.thrower) - react_to_attack(AM.thrower) - -//SA vs SA basically -/mob/living/simple_mob/attack_generic(var/mob/attacker) - if(attacker) - react_to_attack(attacker) - return ..() - -/mob/living/simple_mob/movement_delay() - var/tally = 0 //Incase I need to add stuff other than "speed" later - - tally = speed - - if(force_max_speed) - return -3 - - for(var/datum/modifier/M in modifiers) - if(!isnull(M.haste) && M.haste == TRUE) - return -3 - if(!isnull(M.slowdown)) - tally += M.slowdown - - if(purge)//Purged creatures will move more slowly. The more time before their purge stops, the slower they'll move. - if(tally <= 0) - tally = 1 - tally *= purge - - if(m_intent == "walk") - tally *= 1.5 - - return tally+config.animal_delay - -/mob/living/simple_mob/Stat() - ..() - - if(statpanel("Status") && show_stat_health) - stat(null, "Health: [round((health / getMaxHealth()) * 100)]%") - -/mob/living/simple_mob/lay_down() - ..() - if(resting && icon_rest) - icon_state = icon_rest - else - icon_state = icon_living - update_icon() - -/mob/living/simple_mob/death(gibbed, deathmessage = "dies!") - density = 0 //We don't block even if we did before - walk(src, 0) //We stop any background-processing walks - resting = 0 //We can rest in peace later. - - if(faction_friends.len) - faction_friends -= src - - if(loot_list.len) //Drop any loot - for(var/path in loot_list) - if(prob(loot_list[path])) - new path(get_turf(src)) - - spawn(3) //We'll update our icon in a sec - update_icon() - - return ..(gibbed,deathmessage) - -/mob/living/simple_mob/ex_act(severity) - if(!blinded) - flash_eyes() - var/armor = run_armor_check(def_zone = null, attack_flag = "bomb") - var/bombdam = 500 - switch (severity) - if (1.0) - bombdam = 500 - if (2.0) - bombdam = 60 - if (3.0) - bombdam = 30 - - apply_damage(damage = bombdam, damagetype = BRUTE, def_zone = null, blocked = armor, blocked = resistance, used_weapon = null, sharp = FALSE, edge = FALSE) - - if(bombdam > maxHealth) - gib() - -// Check target_mob if worthy of attack (i.e. check if they are dead or empty mecha) -/mob/living/simple_mob/proc/SA_attackable(target_mob) - ai_log("SA_attackable([target_mob])",3) - if (isliving(target_mob)) - var/mob/living/L = target_mob - if(L.stat != DEAD) - return 1 - if (istype(target_mob,/obj/mecha)) - var/obj/mecha/M = target_mob - if (M.occupant) - return 1 - ai_log("SA_attackable([target_mob]): no",3) - return 0 - -/mob/living/simple_mob/say(var/message,var/datum/language/language) - var/verb = "says" - if(speak_emote.len) - verb = pick(speak_emote) - - message = sanitize(message) - - ..(message, null, verb) - -/mob/living/simple_mob/get_speech_ending(verb, var/ending) - return verb - -/mob/living/simple_mob/put_in_hands(var/obj/item/W) // No hands. - if(has_hands) - put_in_active_hand(W) - return 1 - W.forceMove(get_turf(src)) - return 1 - -// Harvest an animal's delicious byproducts -/mob/living/simple_mob/proc/harvest(var/mob/user) - var/actual_meat_amount = max(1,(meat_amount/2)) - if(meat_type && actual_meat_amount>0 && (stat == DEAD)) - for(var/i=0;i[user] chops up \the [src]!") - new/obj/effect/decal/cleanable/blood/splatter(get_turf(src)) - qdel(src) - else - user.visible_message("[user] butchers \the [src] messily!") - gib() - -/mob/living/simple_mob/handle_fire() - return -/mob/living/simple_mob/update_fire() - return -/mob/living/simple_mob/IgniteMob() - return -/mob/living/simple_mob/ExtinguishMob() - return - -//We got hit! Consider hitting them back! -/mob/living/simple_mob/proc/react_to_attack(var/mob/living/M) - if(ai_inactive || stat || M == target_mob) return //Not if we're dead or already hitting them - if(M in friends || M.faction == faction) return //I'll overlook it THIS time... - ai_log("react_to_attack([M])",1) - if(retaliate && set_target(M, 1)) - handle_stance(STANCE_ATTACK) - return M - - return 0 - -/mob/living/simple_mob/proc/set_target(var/mob/M, forced = 0) - ai_log("SetTarget([M])",2) - if(!M || (world.time - last_target_time < 5 SECONDS) && target_mob) - ai_log("SetTarget() can't set it again so soon",3) - return 0 - - var/turf/seen = get_turf(M) - - if(investigates && (annoyed < 10)) - try_say_list(say_maybe_target) - face_atom(seen) - annoyed += 14 - sleep(1 SECOND) //For realism - - if(forced || (M in ListTargets(view_range))) - try_say_list(say_got_target) - target_mob = M - last_target_time = world.time - return M - else if(investigates) - spawn(1) - WanderTowards(seen) - - return 0 - -// Set a follow target, with optional time for how long to follow them. -/mob/living/simple_mob/proc/set_follow(var/mob/M, var/follow_for = 0) - ai_log("SetFollow([M]) for=[follow_for]",2) - if(!M || (world.time - last_target_time < 4 SECONDS) && follow_mob) - ai_log("SetFollow() can't set it again so soon",3) - return 0 - - follow_mob = M - last_follow_time = world.time - follow_until_time = !follow_for ? 0 : world.time + follow_for - return 1 - -//Scan surroundings for a valid target -/mob/living/simple_mob/proc/FindTarget() - var/atom/T = null - for(var/atom/A in ListTargets(view_range)) - - if(A == src) - continue - - var/atom/F = Found(A) - if(F) - T = F - break - else if(specific_targets) - return 0 - - if(isliving(A)) - var/mob/living/L = A - if(L.faction == src.faction && !attack_same) - continue - else if(L in friends) - continue - else if(L.alpha <= EFFECTIVE_INVIS) - continue - else if(!SA_attackable(L)) - continue - else if(!special_target_check(L)) - continue - else - T = L - break - - else if(istype(A, /obj/mecha)) // Our line of sight stuff was already done in ListTargets(). - var/obj/mecha/M = A - if(!SA_attackable(M)) - continue - else if(!special_target_check(M)) - continue - if((M.occupant.faction != src.faction) || attack_same) - T = M - break - - //You found one! - if(T) - ai_log("FindTarget() found [T]!",1) - if(set_target(T)) - handle_stance(STANCE_ATTACK) - - return T - -//Used for special targeting or reactions -/mob/living/simple_mob/proc/Found(var/atom/A) - return - -// Used for somewhat special targeting, but not to the extent of using Found() -/mob/living/simple_mob/proc/special_target_check(var/atom/A) - return TRUE - -//Requesting help from like-minded individuals -/mob/living/simple_mob/proc/RequestHelp() - if(!cooperative || ((world.time - last_helpask_time) < 10 SECONDS)) - return - - ai_log("RequestHelp() to [faction_friends.len] friends",2) - last_helpask_time = world.time - for(var/mob/living/simple_mob/F in faction_friends) - if(F == src) continue - if(get_dist(src,F) <= F.assist_distance) - spawn(0) - if(F) //They could have died by now and some mobs delete themselves on death - ai_log("RequestHelp() to [F]",3) - F.HelpRequested(src) - -//Someone wants help? -/mob/living/simple_mob/proc/HelpRequested(var/mob/living/simple_mob/F) - if(target_mob || stat) - ai_log("HelpRequested() by [F] but we're busy/dead",2) - return - if(get_dist(src,F) <= follow_dist) - ai_log("HelpRequested() by [F] but we're already here",2) - return - if(get_dist(src,F) <= view_range) - ai_log("HelpRequested() by [F] and within targetshare range",2) - if(F.target_mob && set_target(F.target_mob)) - handle_stance(STANCE_ATTACK) - return - - if(set_follow(F, 10 SECONDS)) - handle_stance(STANCE_FOLLOW) - -// Can be used to conditionally do a ranged or melee attack. -// Note that the SA must be able to do an attack at the specified range or else it may get trapped in a loop of switching -// between STANCE_ATTACK and STANCE_ATTACKING, due to being told by MoveToTarget() that they're in range but being told by AttackTarget() that they're not. -/mob/living/simple_mob/proc/ClosestDistance() - return ranged ? shoot_range - 1 : 1 // Shoot range -1 just because we don't want to constantly get kited - -//Move to a target (or near if we're ranged) -/mob/living/simple_mob/proc/MoveToTarget() - if(incapacitated(INCAPACITATION_DISABLED)) - ai_log("MoveToTarget() Bailing because we're disabled",2) - return - - //If we were chasing someone and we can't anymore, give up. - if(!target_mob || !SA_attackable(target_mob)) - ai_log("MoveToTarget() Losing target at top",2) - LoseTarget() - return - - //Don't wander - stop_automated_movement = 1 - move_to_delay = initial(move_to_delay) - - //We recompute our path every time we're called if we can still see them - if(target_mob in ListTargets(view_range)) - - //Recompute the path if we were using one since we can still see them. - if(astarpathing) - ForgetPath() - - //Find out where we're getting to - var/get_to = ClosestDistance() - var/distance = get_dist(src,target_mob) - ai_log("MoveToTarget() [src] get_to: [get_to] distance: [distance]",2) - - //We're here! - if(distance <= get_to) - ai_log("MoveToTarget() [src] attack range",2) - handle_stance(STANCE_ATTACKING) - return - - //We're just setting out, making a new path, or we can't path with A* - if(!walk_list.len) - ai_log("SA: MoveToTarget() pathing to [target_mob]",2) - - //GetPath failed for whatever reason, just smash into things towards them - if(run_at_them || !GetPath(get_turf(target_mob),get_to)) - - //We try the built-in way to stay close - walk_to(src, target_mob, get_to, move_to_delay) - ai_log("MoveToTarget() walk_to([src],[target_mob],[get_to],[move_to_delay])",3) - - //Break shit in their direction! LEME SMAHSH - var/dir_to_mob = get_dir(src,target_mob) - face_atom(target_mob) - DestroySurroundings(dir_to_mob) - ai_log("MoveToTarget() DestroySurroundings([get_dir(src,target_mob)])",3) - - //We have a path! We aren't already pathing it! - if(!astarpathing && walk_list.len) - ai_log("MoveToTarget() going to start a path",2) - spawn(1) - - //Do the path! - var/result = WalkPath(target_thing = target_mob, target_dist = get_to) - ai_log("MoveToTarget() WalkPath r:[result]",2) - - //WalkPath failed, either interrupted for recalc, or something else - if(!result) - return - - //WalkPath either got close enough or we ran out of path - else - spawn(1) - ai_log("MoveToTarget() resetting",2) - MoveToTarget() - - //We can't see them, and we don't have a path we're trying to follow to find them - else if(!astarpathing) - ai_log("MoveToTarget() Losing target at bottom",2) - LoseTarget() //Just forget it. - -//Follow a target (and don't attempt to murder it horribly) -/mob/living/simple_mob/proc/FollowTarget() - ai_log("FollowTarget() [follow_mob]",1) - stop_automated_movement = 1 - //If we were chasing someone and we can't anymore, give up. - if(!follow_mob || follow_mob.stat) - ai_log("FollowTarget() Losing follow at top",2) - LoseFollow() - return - - if(incapacitated(INCAPACITATION_DISABLED)) - ai_log("FollowTarget() Bailing because we're disabled",2) - LoseFollow() - return - - if((get_dist(src,follow_mob) <= follow_dist)) - ai_log("FollowTarget() Already at target",2) - return - - move_to_delay = initial(move_to_delay) - var/start_distance = get_dist(src,follow_mob) - - //Bad pathing - if(run_at_them) - walk_to(src, follow_mob, follow_dist, move_to_delay) - ai_log("FollowTarget() walk_to([src],[target_mob],2,[move_to_delay])",3) - spawn(3 SECONDS) - if(src && follow_mob && (stance == STANCE_FOLLOW) && (get_dist(src,follow_mob) >= start_distance)) - ai_log("FollowTarget() walk_to not making headway, giving up",3) - LoseFollow() - - //Good pathing - else - GetPath(get_turf(follow_mob),follow_dist) - if(!astarpathing && walk_list.len) - spawn(1) - ai_log("FollowTarget() A* path getting underway",2) - //Do the path! - var/result = WalkPath(target_thing = follow_mob, target_dist = follow_dist) - ai_log("FollowTarget() WalkPath r:[result]",3) - - else - ai_log("FollowTarget() GetPath can't path, giving up",3) - LoseFollow() - -//Just try one time to go look at something. Don't really focus much on it. -/mob/living/simple_mob/proc/WanderTowards(var/turf/T) - if(!T) return - ai_log("WanderTowards() [T.x],[T.y]",1) - - stop_automated_movement = 1 - GetPath(T,1) - - if(run_at_them || !walk_list.len) - ai_log("WanderTowards() walk_to getting underway",2) - walk_to(src, T, 1, move_to_delay) - else - if(!astarpathing) - spawn(1) - ai_log("WanderTowards() A* path getting underway",2) - WalkPath(target_thing = T, target_dist = 1) - -//A* now, try to a path to a target -/mob/living/simple_mob/proc/GetPath(var/turf/target,var/get_to = 1,var/max_distance = world.view*6) - ai_log("GetPath([target],[get_to],[max_distance])",2) - ForgetPath() - var/list/new_path = AStar(get_turf(loc), target, astar_adjacent_proc, /turf/proc/Distance, min_target_dist = get_to, max_node_depth = max_distance, id = myid, exclude = obstacles) - - if(new_path && new_path.len) - walk_list = new_path - if(path_display) - for(var/turf/T in walk_list) - T.overlays |= path_overlay - else - return 0 - - return walk_list.len - -//Walk along our A* path, target_thing allows us to stop early if we're nearby -/mob/living/simple_mob/proc/WalkPath(var/atom/target_thing, var/target_dist = 1, var/proc/steps_callback = null, var/every_steps = 4) - ai_log("WalkPath() (steps:[walk_list.len])",2) - if(!walk_list || !walk_list.len) - return - - astarpathing = 1 - var/step_count = 0 - var/failed_steps = 0 - while(1) - //We're supposed to stop - if(!astarpathing || incapacitated(INCAPACITATION_DISABLED)) - astarpathing = 0 - ai_log("WalkPath() was interrupted",2) - return 0 - //Finished the path - if(!walk_list.len) - astarpathing = 0 - ai_log("WalkPath() exited naturally",2) - return 1 - if(failed_steps >= 3) - astarpathing = 0 - ai_log("WalkPath() failed too many steps",2) - return 0 - - //Take a step - if(!MoveOnce()) - ai_log("WalkPath() failed a step",3) - failed_steps++ - else - ai_log("WalkPath() took a step",3) - failed_steps = 0 - step_count++ - - //If we have a particular target we care about, look for them - if(target_thing && (get_dist(src,target_thing) <= target_dist)) - ai_log("WalkPath() returning due to proximity",2) - return target_thing - - //If we have a callback - if(steps_callback && (step_count >= every_steps)) - ai_log("WalkPath() doing callback",3) - call(steps_callback)() - - //And wait for the time to our next step - sleep(move_to_delay) - -//Take one step along a path -/mob/living/simple_mob/proc/MoveOnce() - if(!walk_list.len) - return - - if(path_display) - var/turf/T = src.walk_list[1] - T.overlays -= path_overlay - - step_towards(src, src.walk_list[1]) - if(src.loc != src.walk_list[1]) - ai_log("MoveOnce() step_towards returning 0",3) - return 0 - else - walk_list -= src.walk_list[1] - ai_log("MoveOnce() step_towards returning 1",3) - return 1 - -//Forget the path entirely -/mob/living/simple_mob/proc/ForgetPath() - ai_log("ForgetPath()",2) - if(path_display) - for(var/turf/T in walk_list) - T.overlays -= path_overlay - astarpathing = 0 - walk_list.Cut() - -//Giving up on moving -/mob/living/simple_mob/proc/GiveUpMoving() - ai_log("GiveUpMoving()",1) - ForgetPath() - walk(src, 0) - stop_automated_movement = 0 - -//Return home, all-in-one proc (though does target scan and drop out if they see one) -/mob/living/simple_mob/proc/GoHome() - if(!home_turf) return - if(astarpathing) ForgetPath() - ai_log("GoHome()",1) - var/close_enough = 2 - var/look_in = 50 - if(GetPath(home_turf,close_enough,look_in)) - stop_automated_movement = 1 - spawn(1) - if(WalkPath()) //If we made it without interruption - ai_log("GoHome() got home",2) - GiveUpMoving() //Go back to wandering - -//Get into attack mode on a target -/mob/living/simple_mob/proc/AttackTarget() - stop_automated_movement = 1 - if(incapacitated(INCAPACITATION_DISABLED)) - ai_log("AttackTarget() Bailing because we're disabled",2) - LoseTarget() - return 0 - if(!target_mob || !SA_attackable(target_mob) || (target_mob.alpha <= EFFECTIVE_INVIS)) //if the target went invisible, you can't follow it - LoseTarget() - return 0 - if(!(target_mob in ListTargets(view_range))) - LostTarget() - return 0 - - ai_log("AttackTarget() vs. [target_mob]",1) - var/distance = get_dist(src, target_mob) - face_atom(target_mob) - - //Hadoooooken! - if(prob(spattack_prob) && (distance >= spattack_min_range) && (distance <= spattack_max_range)) - ai_log("AttackTarget() special",3) - if(SpecialAtkTarget()) //Might not succeed/be allowed, do something else. - return 1 - //AAAAH! - if(distance <= 1) - ai_log("AttackTarget() melee",3) - PunchTarget() - return 1 - //Open fire! - else if(ranged && (distance <= shoot_range)) - ai_log("AttackTarget() ranged",3) - ShootTarget(target_mob) - return 1 - //They ran away! - else - ai_log("AttackTarget() out of range!",3) - stoplag(1) // Unfortunately this is needed to protect from ClosestDistance() sometimes not updating fast enough to prevent an infinite loop. - handle_stance(STANCE_ATTACK) - return 0 - -//Attack the target in melee -/mob/living/simple_mob/proc/PunchTarget() - if(!Adjacent(target_mob)) - return - if(!canClick()) - return - setClickCooldown(get_attack_speed()) -// if(!client) -// sleep(rand(melee_attack_minDelay, melee_attack_maxDelay)) - if(isliving(target_mob)) - var/mob/living/L = target_mob - - if(prob(melee_miss_chance)) - add_attack_logs(src,L,"Animal-attacked (miss)", admin_notify = FALSE) - visible_message("[src] misses [L]!") - do_attack_animation(src) - return L - else - DoPunch(L) - return L - if(istype(target_mob,/obj/mecha)) - var/obj/mecha/M = target_mob - DoPunch(M) - return M - -// This is the actual act of 'punching'. Override for special behaviour. -/mob/living/simple_mob/proc/DoPunch(var/atom/A) - if(!Adjacent(A) && !istype(A, /obj/structure/window) && !istype(A, /obj/machinery/door/window)) // They could've moved in the meantime. But a Window probably wouldn't have. This allows player simple-mobs to attack windows. - return FALSE - - var/damage_to_do = rand(melee_damage_lower, melee_damage_upper) - - for(var/datum/modifier/M in modifiers) - if(!isnull(M.outgoing_melee_damage_percent)) - damage_to_do *= M.outgoing_melee_damage_percent - - // SA attacks can be blocked with shields. - if(ishuman(A)) - var/mob/living/carbon/human/H = A - if(H.check_shields(damage = damage_to_do, damage_source = src, attacker = src, def_zone = null, attack_text = "the attack")) - return FALSE - - if(A.attack_generic(src, damage_to_do, pick(attacktext), attack_armor_type, attack_armor_pen, attack_sharp, attack_edge) && attack_sound) - playsound(src, attack_sound, 75, 1) - - return TRUE - -//The actual top-level ranged attack proc -/mob/living/simple_mob/proc/ShootTarget() - if(!canClick()) - return FALSE - - setClickCooldown(get_attack_speed()) - - var/target = target_mob - var/tturf = get_turf(target) - - if((firing_lines && !client) && !CheckFiringLine(tturf)) - step_rand(src) - face_atom(tturf) - return FALSE - - visible_message("[src] fires at [target]!") - if(rapid) - spawn(1) - Shoot(target, src.loc, src) - if(casingtype) - new casingtype(get_turf(src)) - spawn(4) - Shoot(target, src.loc, src) - if(casingtype) - new casingtype(get_turf(src)) - spawn(6) - Shoot(target, src.loc, src) - if(casingtype) - new casingtype(get_turf(src)) - else - Shoot(target, src.loc, src) - if(casingtype) - new casingtype - - return TRUE - -//Check firing lines for faction_friends (if we're not cooperative, we don't care) -/mob/living/simple_mob/proc/CheckFiringLine(var/turf/tturf) - if(!tturf) return - - var/turf/list/crosses = list() - var/this_turf = get_turf(src) - - while(this_turf != tturf) - this_turf = get_step(this_turf,get_dir(this_turf,tturf)) - crosses += this_turf - - for(var/mob/living/FF in faction_friends) - if(FF.loc in crosses) - return 0 - - for(var/mob/living/F in friends) - if(F.loc in crosses) - return 0 - - return 1 - -//Special attacks, like grenades or blinding spit or whatever -/mob/living/simple_mob/proc/SpecialAtkTarget() - return 0 - -//Shoot a bullet at someone -/mob/living/simple_animal/proc/Shoot(atom/target, atom/start, mob/user, var/bullet = 0) - if(target == start) - return - - var/obj/item/projectile/A = new projectiletype(user.loc) - playsound(user, projectilesound, 100, 1) - if(!A) return - -// if (!istype(target, /turf)) -// qdel(A) -// return - A.old_style_target(target) - A.fire() - -//We can't see the target -/mob/living/simple_mob/proc/LoseTarget() - ai_log("LoseTarget() [target_mob]",2) - target_mob = null - handle_stance(STANCE_IDLE) - GiveUpMoving() - -//Target is no longer valid (?) -/mob/living/simple_mob/proc/LostTarget() - handle_stance(STANCE_IDLE) - GiveUpMoving() - -//Forget a follow mode -/mob/living/simple_mob/proc/LoseFollow() - ai_log("LoseFollow() [target_mob]",2) - stop_automated_movement = 0 - follow_mob = null - handle_stance(STANCE_IDLE) - GiveUpMoving() - -// Makes the simple mob stop everything. Useful for when it get stunned. -/mob/living/simple_mob/proc/Disable() - ai_log("Disable() [target_mob]",2) - spawn(0) - LoseTarget() - LoseFollow() - -/mob/living/simple_mob/Stun(amount) - if(amount > 0) - Disable() - ..(amount) - -/mob/living/simple_mob/AdjustStunned(amount) - if(amount > 0) - Disable() - ..(amount) - -/mob/living/simple_mob/Weaken(amount) - if(amount > 0) - Disable() - ..(amount) - -/mob/living/simple_mob/AdjustWeakened(amount) - if(amount > 0) - Disable() - ..(amount) - -/mob/living/simple_mob/Paralyse(amount) - if(amount > 0) - Disable() - ..(amount) - -/mob/living/simple_mob/AdjustParalysis(amount) - if(amount > 0) - Disable() - ..(amount) - -//Find me some targets -/mob/living/simple_mob/proc/ListTargets(var/dist = view_range) - var/list/L = hearers(src, dist) - - for(var/obj/mecha/M in mechas_list) - if ((M.z == src.z) && (get_dist(src, M) <= dist) && (isInSight(src,M))) - L += M - - return L - -//Break through windows/other things -/mob/living/simple_mob/proc/DestroySurroundings(var/direction) - if(!direction) - direction = pick(cardinal) //FLAIL WILDLY - - var/turf/problem_turf = get_step(src, direction) - - ai_log("DestroySurroundings([direction])",3) - var/damage_to_do = rand(melee_damage_lower, melee_damage_upper) - - for(var/datum/modifier/M in modifiers) - if(!isnull(M.outgoing_melee_damage_percent)) - damage_to_do *= M.outgoing_melee_damage_percent - - for(var/obj/structure/window/obstacle in problem_turf) - if(obstacle.dir == reverse_dir[dir]) // So that windows get smashed in the right order - ai_log("DestroySurroundings() directional window hit",3) - obstacle.attack_generic(src, damage_to_do, pick(attacktext)) - return - else if(obstacle.is_fulltile()) - ai_log("DestroySurroundings() full tile window hit",3) - obstacle.attack_generic(src, damage_to_do, pick(attacktext)) - return - - var/obj/structure/obstacle = locate(/obj/structure, problem_turf) - if(istype(obstacle, /obj/structure/window) || istype(obstacle, /obj/structure/closet) || istype(obstacle, /obj/structure/table) || istype(obstacle, /obj/structure/grille)) - ai_log("DestroySurroundings() generic structure hit [obstacle]",3) - obstacle.attack_generic(src, damage_to_do, pick(attacktext)) - return - - for(var/obj/machinery/door/baddoor in problem_turf) //Required since firelocks take up the same turf - if(baddoor.density) - ai_log("DestroySurroundings() door hit [baddoor]",3) - baddoor.attack_generic(src, damage_to_do, pick(attacktext)) - return - -//Check for shuttle bumrush -/mob/living/simple_mob/proc/check_horde() - return 0 - if(emergency_shuttle.shuttle.location) - if(!enroute && !target_mob) //The shuttle docked, all monsters rush for the escape hallway - if(!shuttletarget && escape_list.len) //Make sure we didn't already assign it a target, and that there are targets to pick - shuttletarget = pick(escape_list) //Pick a shuttle target - enroute = 1 - stop_automated_movement = 1 - spawn() - if(!src.stat) - horde() - - if(get_dist(src, shuttletarget) <= 2) //The monster reached the escape hallway - enroute = 0 - stop_automated_movement = 0 - -//Shuttle bumrush -/mob/living/simple_mob/proc/horde() - var/turf/T = get_step_to(src, shuttletarget) - for(var/atom/A in T) - if(istype(A,/obj/machinery/door/airlock)) - var/obj/machinery/door/airlock/D = A - D.open(1) - else if(istype(A,/obj/structure/simple_door)) - var/obj/structure/simple_door/D = A - if(D.density) - D.Open() - else if(istype(A,/obj/structure/cult/pylon)) - A.attack_generic(src, rand(melee_damage_lower, melee_damage_upper)) - else if(istype(A, /obj/structure/window) || istype(A, /obj/structure/closet) || istype(A, /obj/structure/table) || istype(A, /obj/structure/grille)) - A.attack_generic(src, rand(melee_damage_lower, melee_damage_upper)) - Move(T) - FindTarget() - if(!target_mob || enroute) - spawn(10) - if(!src.stat) - horde() - -//Touches a wire, etc -/mob/living/simple_mob/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0, var/def_zone = null) - shock_damage *= max(siemens_coeff - shock_resistance, 0) - if (shock_damage < 1) - return 0 - - apply_damage(damage = shock_damage, damagetype = BURN, def_zone = null, blocked = null, blocked = resistance, used_weapon = null, sharp = FALSE, edge = FALSE) - playsound(loc, "sparks", 50, 1, -1) - - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(5, 1, loc) - s.start() - -//Shot with taser/stunvolver -/mob/living/simple_mob/stun_effect_act(var/stun_amount, var/agony_amount, var/def_zone, var/used_weapon=null) - if(taser_kill) - var/stunDam = 0 - var/agonyDam = 0 - var/armor = run_armor_check(def_zone = null, attack_flag = "energy") - - if(stun_amount) - stunDam += stun_amount * 0.5 - apply_damage(damage = stunDam, damagetype = BURN, def_zone = null, blocked = armor, blocked = resistance, used_weapon = used_weapon, sharp = FALSE, edge = FALSE) - - if(agony_amount) - agonyDam += agony_amount * 0.5 - apply_damage(damage = agonyDam, damagetype = BURN, def_zone = null, blocked = armor, blocked = resistance, used_weapon = used_weapon, sharp = FALSE, edge = FALSE) - -/mob/living/simple_mob/emp_act(severity) - if(!isSynthetic()) - return - switch(severity) - if(1) - adjustFireLoss(rand(15, 25)) - if(2) - adjustFireLoss(rand(10, 18)) - if(3) - adjustFireLoss(rand(5, 12)) - if(4) - adjustFireLoss(rand(1, 6)) - -/mob/living/simple_mob/getarmor(def_zone, attack_flag) - var/armorval = armor[attack_flag] - if(!armorval) - return 0 - else - return armorval -/* -// Force it to target something -/mob/living/simple_mob/proc/taunt(var/mob/living/new_target, var/forced = FALSE) - if(intelligence_level == SA_HUMANOID && !forced) - return - set_target(new_target) -*/ -/mob/living/simple_mob/is_sentient() - return intelligence_level != SA_PLANT && intelligence_level != SA_ROBOTIC - -// Hand procs for player-controlled SA's -/mob/living/simple_mob/swap_hand() - src.hand = !( src.hand ) - if(hud_used.l_hand_hud_object && hud_used.r_hand_hud_object) - if(hand) //This being 1 means the left hand is in use - hud_used.l_hand_hud_object.icon_state = "l_hand_active" - hud_used.r_hand_hud_object.icon_state = "r_hand_inactive" - else - hud_used.l_hand_hud_object.icon_state = "l_hand_inactive" - hud_used.r_hand_hud_object.icon_state = "r_hand_active" - return -/* -/mob/living/simple_mob/put_in_active_hand(var/obj/item/I) - if(!has_hands || !istype(I)) - return -*/ -//Puts the item into our active hand if possible. returns 1 on success. -/mob/living/simple_mob/put_in_active_hand(var/obj/item/W) - if(!has_hands) - return FALSE - return (hand ? put_in_l_hand(W) : put_in_r_hand(W)) - -/mob/living/simple_mob/put_in_l_hand(var/obj/item/W) - if(!..() || l_hand) - return 0 - W.forceMove(src) - l_hand = W - W.equipped(src,slot_l_hand) - W.add_fingerprint(src) - update_inv_l_hand() - return TRUE - -/mob/living/simple_mob/put_in_r_hand(var/obj/item/W) - if(!..() || r_hand) - return 0 - W.forceMove(src) - r_hand = W - W.equipped(src,slot_r_hand) - W.add_fingerprint(src) - update_inv_r_hand() - return TRUE - -/mob/living/simple_mob/update_inv_r_hand() - if(QDESTROYING(src)) - return - - if(r_hand) - r_hand.screen_loc = ui_rhand //TODO - - //determine icon state to use - var/t_state - if(r_hand.item_state_slots && r_hand.item_state_slots[slot_r_hand_str]) - t_state = r_hand.item_state_slots[slot_r_hand_str] - else if(r_hand.item_state) - t_state = r_hand.item_state - else - t_state = r_hand.icon_state - - //determine icon to use - var/icon/t_icon - if(r_hand.item_icons && (slot_r_hand_str in r_hand.item_icons)) - t_icon = r_hand.item_icons[slot_r_hand_str] - else if(r_hand.icon_override) - t_state += "_r" - t_icon = r_hand.icon_override - else - t_icon = INV_R_HAND_DEF_ICON - - //apply color - var/image/standing = image(icon = t_icon, icon_state = t_state) - standing.color = r_hand.color - - r_hand_sprite = standing - - else - r_hand_sprite = null - - update_icon() - -/mob/living/simple_mob/update_inv_l_hand() - if(QDESTROYING(src)) - return - - if(l_hand) - l_hand.screen_loc = ui_lhand //TODO - - //determine icon state to use - var/t_state - if(l_hand.item_state_slots && l_hand.item_state_slots[slot_l_hand_str]) - t_state = l_hand.item_state_slots[slot_l_hand_str] - else if(l_hand.item_state) - t_state = l_hand.item_state - else - t_state = l_hand.icon_state - - //determine icon to use - var/icon/t_icon - if(l_hand.item_icons && (slot_l_hand_str in l_hand.item_icons)) - t_icon = l_hand.item_icons[slot_l_hand_str] - else if(l_hand.icon_override) - t_state += "_l" - t_icon = l_hand.icon_override - else - t_icon = INV_L_HAND_DEF_ICON - - //apply color - var/image/standing = image(icon = t_icon, icon_state = t_state) - standing.color = l_hand.color - - l_hand_sprite = standing - - else - l_hand_sprite = null - - update_icon() - -//Can insert extra huds into the hud holder here. -/mob/living/simple_mob/proc/extra_huds(var/datum/hud/hud,var/icon/ui_style,var/list/hud_elements) - return - -//If they can or cannot use tools/machines/etc -/mob/living/simple_mob/IsAdvancedToolUser() - return has_hands - -/mob/living/simple_mob/proc/IsHumanoidToolUser(var/atom/tool) - if(!humanoid_hands) - var/display_name = null - if(tool) - display_name = tool - else - display_name = "object" - to_chat(src, "Your [hand_form] are not fit for use of \the [display_name].") - return humanoid_hands - -/mob/living/simple_mob/drop_from_inventory(var/obj/item/W, var/atom/target = null) - . = ..(W, target) - if(!target) - target = src.loc - if(.) - W.forceMove(src.loc) - -//Commands, reactions, etc -/mob/living/simple_mob/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "", var/italics = 0, var/mob/speaker = null, var/sound/speech_sound, var/sound_vol) - ..() - if(!ai_inactive && reacts && speaker && (message in reactions) && (!hostile || isliving(speaker)) && say_understands(speaker,language)) - var/mob/living/L = speaker - if(L.faction == faction) - spawn(10) - face_atom(speaker) - say(reactions[message]) - -//Just some subpaths for easy searching -/mob/living/simple_mob/hostile - faction = "not yours" - hostile = 1 - retaliate = 1 - stop_when_pulled = 0 - destroy_surroundings = 1 - -/mob/living/simple_mob/retaliate - retaliate = 1 - destroy_surroundings = 1 - -/mob/living/simple_mob/get_nametag_desc(mob/user) - return "[tt_desc]" diff --git a/code/modules/mob/living/simple_animal/simple_hud.dm b/code/modules/mob/living/simple_animal/simple_hud.dm deleted file mode 100644 index fe851648b4c..00000000000 --- a/code/modules/mob/living/simple_animal/simple_hud.dm +++ /dev/null @@ -1,311 +0,0 @@ -/mob/living/simple_mob/instantiate_hud(var/datum/hud/hud) - if(!client) - return //Why bother. - - var/ui_style = 'icons/mob/screen1_animal.dmi' - if(ui_icons) - ui_style = ui_icons - - var/ui_color = "#ffffff" - var/ui_alpha = 255 - - var/list/adding = list() - var/list/other = list() - var/list/hotkeybuttons = list() - var/list/slot_info = list() - - hud.adding = adding - hud.other = other - hud.hotkeybuttons = hotkeybuttons - - var/list/hud_elements = list() - var/obj/screen/using - var/obj/screen/inventory/inv_box - - var/has_hidden_gear - if(LAZYLEN(hud_gears)) - for(var/gear_slot in hud_gears) - inv_box = new /obj/screen/inventory() - inv_box.icon = ui_style - inv_box.color = ui_color - inv_box.alpha = ui_alpha - - var/list/slot_data = hud_gears[gear_slot] - inv_box.name = gear_slot - inv_box.screen_loc = slot_data["loc"] - inv_box.slot_id = slot_data["slot"] - inv_box.icon_state = slot_data["state"] - slot_info["[inv_box.slot_id]"] = inv_box.screen_loc - - if(slot_data["dir"]) - inv_box.set_dir(slot_data["dir"]) - - if(slot_data["toggle"]) - other += inv_box - has_hidden_gear = 1 - else - adding += inv_box - - if(has_hidden_gear) - using = new /obj/screen() - using.name = "toggle" - using.icon = ui_style - using.icon_state = "other" - using.screen_loc = ui_inventory - using.hud_layerise() - using.color = ui_color - using.alpha = ui_alpha - adding += using - - //Intent Backdrop - using = new /obj/screen() - using.name = "act_intent" - using.icon = ui_style - using.icon_state = "intent_"+a_intent - using.screen_loc = ui_acti - using.color = ui_color - using.alpha = ui_alpha - hud.adding += using - hud.action_intent = using - - hud_elements |= using - - //Small intent quarters - var/icon/ico - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),1,ico.Height()/2,ico.Width()/2,ico.Height()) - using = new /obj/screen() - using.name = I_HELP - using.icon = ico - using.screen_loc = ui_acti - using.alpha = ui_alpha - using.layer = LAYER_HUD_ITEM //These sit on the intent box - hud.adding += using - hud.help_intent = using - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),ico.Width()/2,ico.Height()/2,ico.Width(),ico.Height()) - using = new /obj/screen() - using.name = I_DISARM - using.icon = ico - using.screen_loc = ui_acti - using.alpha = ui_alpha - using.layer = LAYER_HUD_ITEM - hud.adding += using - hud.disarm_intent = using - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),ico.Width()/2,1,ico.Width(),ico.Height()/2) - using = new /obj/screen() - using.name = I_GRAB - using.icon = ico - using.screen_loc = ui_acti - using.alpha = ui_alpha - using.layer = LAYER_HUD_ITEM - hud.adding += using - hud.grab_intent = using - - ico = new(ui_style, "black") - ico.MapColors(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, -1,-1,-1,-1) - ico.DrawBox(rgb(255,255,255,1),1,1,ico.Width()/2,ico.Height()/2) - using = new /obj/screen() - using.name = I_HURT - using.icon = ico - using.screen_loc = ui_acti - using.alpha = ui_alpha - using.layer = LAYER_HUD_ITEM - hud.adding += using - hud.hurt_intent = using - - //Move intent (walk/run) - using = new /obj/screen() - using.name = "mov_intent" - using.icon = ui_style - using.icon_state = (m_intent == "run" ? "running" : "walking") - using.screen_loc = ui_movi - using.color = ui_color - using.alpha = ui_alpha - hud.adding += using - hud.move_intent = using - - //Resist button - using = new /obj/screen() - using.name = "resist" - using.icon = ui_style - using.icon_state = "act_resist" - using.screen_loc = ui_pull_resist - using.color = ui_color - using.alpha = ui_alpha - hud.hotkeybuttons += using - - //Pull button - pullin = new /obj/screen() - pullin.icon = ui_style - pullin.icon_state = "pull0" - pullin.name = "pull" - pullin.screen_loc = ui_pull_resist - hud.hotkeybuttons += pullin - hud_elements |= pullin - - //Health status - healths = new /obj/screen() - healths.icon = ui_style - healths.icon_state = "health0" - healths.name = "health" - healths.screen_loc = ui_health - hud_elements |= healths - - //Oxygen dep icon - oxygen = new /obj/screen() - oxygen.icon = ui_style - oxygen.icon_state = "oxy0" - oxygen.name = "oxygen" - oxygen.screen_loc = ui_oxygen - hud_elements |= oxygen - - //Toxins present icon - toxin = new /obj/screen() - toxin.icon = ui_style - toxin.icon_state = "tox0" - toxin.name = "toxin" - toxin.screen_loc = ui_toxin - hud_elements |= toxin - - //Fire warning - fire = new /obj/screen() - fire.icon = ui_style - fire.icon_state = "fire0" - fire.name = "fire" - fire.screen_loc = ui_fire - hud_elements |= fire - - //Pressure warning - pressure = new /obj/screen() - pressure.icon = ui_style - pressure.icon_state = "pressure0" - pressure.name = "pressure" - pressure.screen_loc = ui_pressure - hud_elements |= pressure - - //Body temp warning - bodytemp = new /obj/screen() - bodytemp.icon = ui_style - bodytemp.icon_state = "temp0" - bodytemp.name = "body temperature" - bodytemp.screen_loc = ui_temp - hud_elements |= bodytemp - - //Nutrition status - nutrition_icon = new /obj/screen() - nutrition_icon.icon = ui_style - nutrition_icon.icon_state = "nutrition0" - nutrition_icon.name = "nutrition" - nutrition_icon.screen_loc = ui_nutrition - hud_elements |= nutrition_icon - - pain = new /obj/screen( null ) - - zone_sel = new /obj/screen/zone_sel( null ) - zone_sel.icon = ui_style - zone_sel.color = ui_color - zone_sel.alpha = ui_alpha - zone_sel.overlays.Cut() - zone_sel.overlays += image('icons/mob/zone_sel.dmi', "[zone_sel.selecting]") - hud_elements |= zone_sel - - //Hand things - if(has_hands) - //Drop button - using = new /obj/screen() - using.name = "drop" - using.icon = ui_style - using.icon_state = "act_drop" - using.screen_loc = ui_drop_throw - using.color = ui_color - using.alpha = ui_alpha - hud.hotkeybuttons += using - - //Equip detail - using = new /obj/screen() - using.name = "equip" - using.icon = ui_style - using.icon_state = "act_equip" - using.screen_loc = ui_equip - using.color = ui_color - using.alpha = ui_alpha - hud.adding += using - - //Hand slots themselves - inv_box = new /obj/screen/inventory/hand() - inv_box.hud = src - inv_box.name = "r_hand" - inv_box.icon = ui_style - inv_box.icon_state = "r_hand_inactive" - if(!hand) //This being 0 or null means the right hand is in use - inv_box.icon_state = "r_hand_active" - inv_box.screen_loc = ui_rhand - inv_box.slot_id = slot_r_hand - inv_box.color = ui_color - inv_box.alpha = ui_alpha - hud.r_hand_hud_object = inv_box - hud.adding += inv_box - slot_info["[slot_r_hand]"] = inv_box.screen_loc - - inv_box = new /obj/screen/inventory/hand() - inv_box.hud = src - inv_box.name = "l_hand" - inv_box.icon = ui_style - inv_box.icon_state = "l_hand_inactive" - if(hand) //This being 1 means the left hand is in use - inv_box.icon_state = "l_hand_active" - inv_box.screen_loc = ui_lhand - inv_box.slot_id = slot_l_hand - inv_box.color = ui_color - inv_box.alpha = ui_alpha - hud.l_hand_hud_object = inv_box - hud.adding += inv_box - slot_info["[slot_l_hand]"] = inv_box.screen_loc - - //Swaphand titlebar - using = new /obj/screen/inventory() - using.name = "hand" - using.icon = ui_style - using.icon_state = "hand1" - using.screen_loc = ui_swaphand1 - using.color = ui_color - using.alpha = ui_alpha - hud.adding += using - - using = new /obj/screen/inventory() - using.name = "hand" - using.icon = ui_style - using.icon_state = "hand2" - using.screen_loc = ui_swaphand2 - using.color = ui_color - using.alpha = ui_alpha - hud.adding += using - - //Throw button - throw_icon = new /obj/screen() - throw_icon.icon = ui_style - throw_icon.icon_state = "act_throw_off" - throw_icon.name = "throw" - throw_icon.screen_loc = ui_drop_throw - throw_icon.color = ui_color - throw_icon.alpha = ui_alpha - hud.hotkeybuttons += throw_icon - hud_elements |= throw_icon - - extra_huds(hud,ui_style,hud_elements) - - client.screen = list() - - client.screen += hud_elements - client.screen += adding + hotkeybuttons - client.screen += client.void - - return diff --git a/code/modules/mob/living/simple_animal/vore/bee.dm b/code/modules/mob/living/simple_animal/vore/bee.dm deleted file mode 100644 index e994c0dcb69..00000000000 --- a/code/modules/mob/living/simple_animal/vore/bee.dm +++ /dev/null @@ -1,45 +0,0 @@ -/mob/living/simple_mob/retaliate/bee - name = "space bumble bee" - desc = "Buzz buzz." - icon = 'icons/mob/vore.dmi' - icon_state = "bee" - icon_living = "bee" - icon_dead = "bee-dead" - - speak = list("Buzzzz") - speak_chance = 1 - - response_help = "pets the" - response_disarm = "gently pushes aside the" - response_harm = "hits the" - - turns_per_move = 5 - speed = 5 - maxHealth = 25 - health = 25 - - harm_intent_damage = 8 - melee_damage_lower = 15 // To do: Make it toxin damage. - melee_damage_upper = 15 - attacktext = list("stung") - - //Space bees aren't affected by atmos. - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - minbodytemp = 0 - - faction = "bee" - -/mob/living/simple_mob/retaliate/bee/Process_Spacemove(var/check_drift = 0) - return 1 //No drifting in space for space bee! - -// Activate Noms! -/mob/living/simple_mob/retaliate/bee - vore_active = 1 - vore_icons = SA_ICON_LIVING diff --git a/code/modules/mob/living/simple_animal/vore/catgirl.dm b/code/modules/mob/living/simple_animal/vore/catgirl.dm deleted file mode 100644 index 4e27b12477a..00000000000 --- a/code/modules/mob/living/simple_animal/vore/catgirl.dm +++ /dev/null @@ -1,67 +0,0 @@ -/mob/living/simple_mob/catgirl - name = "catgirl" - desc = "Her hobbies are catnaps, knocking things over, and headpats." - tt_desc = "Homo felinus" - icon = 'icons/mob/vore.dmi' - icon_state = "catgirl" - intelligence_level = SA_HUMANOID - - speed = 5 - - run_at_them = 0 - cooperative = 1 - investigates = 1 - reacts = 1 - - harm_intent_damage = 5 - melee_damage_lower = 5 - melee_damage_upper = 10 - - response_help = "pets the" - response_disarm = "gently baps the" - response_harm = "hits the" - - speak_chance = 2 - speak = list("Meow!","Esp!","Purr!","HSSSSS","Mew?","Nya~") - speak_emote = list("purrs","meows") - emote_hear = list("meows","mews") - emote_see = list("shakes her head","shivers","stretches","grooms herself") - attacktext = list("swatted","bapped") - - var/random_skin = 1 - var/list/skins = list( - "catgirl", - "catgirlnude", - "catgirlbikini", - "catgirlrednude", - "catgirlredbikini", - "catgirlblacknude", - "catgirlblackbikini", - "catgirlbrownnude", - "catgirlbrownbikini", - "catgirlred", - "catgirlblack", - "catgirlbrown" - ) - -/mob/living/simple_mob/catgirl/New() - ..() - if(random_skin) - icon_living = pick(skins) - icon_rest = "[icon_living]asleep" - icon_dead = "[icon_living]-dead" - update_icon() - -// Activate Noms! -/mob/living/simple_mob/catgirl - vore_active = 1 - vore_bump_chance = 5 - vore_pounce_chance = 50 - vore_standing_too = 1 - vore_ignores_undigestable = 0 // Catgirls just want to eat yoouuu - vore_default_mode = DM_HOLD // Chance that catgirls just wanna bellycuddle yoouuuu! - vore_digest_chance = 25 // But squirming might make them gurgle... - vore_icons = SA_ICON_LIVING | SA_ICON_REST - -/mob/living/simple_mob/catgirl/retaliate - retaliate = 1 diff --git a/code/modules/mob/living/simple_animal/vore/cookiegirl.dm b/code/modules/mob/living/simple_animal/vore/cookiegirl.dm deleted file mode 100644 index 26f2e2c5258..00000000000 --- a/code/modules/mob/living/simple_animal/vore/cookiegirl.dm +++ /dev/null @@ -1,45 +0,0 @@ -/mob/living/simple_mob/cookiegirl - name = "cookiegirl" - desc = "A woman made with a combination of, well... Whatever you put in a cookie. What were the chefs thinking?" - icon = 'icons/mob/vore.dmi' - icon_state = "cookiegirl" - icon_living = "cookiegirl" - icon_rest = "cookiegirl_rest" - icon_dead = "cookiegirl-dead" - - maxHealth = 10 - health = 10 - - speed = 5 - - run_at_them = 0 - cooperative = 1 - investigates = 1 - reacts = 1 - - harm_intent_damage = 2 - melee_damage_lower = 5 - melee_damage_upper = 10 - - speak_chance = 1.5 //I have no idea what to give them for speech. I'll get back to this sometime in the future to add more. - speak = list("Hi!","Are you hungry?","Got milk~?","What to do, what to do...") - speak_emote = list("hums","whistles") - emote_see = list("shakes her head","shivers", "picks a bit of crumb off of her body and sticks it in her mouth.") - reactions = list("Can I eat you?" = "Do you really wanna eat someone as sweet as me~?", - "You look tasty." = "Awww, thank you~!", - "Can I serve you to the crew?" = "If I have a backup, sure!",) - attacktext = list("smacked") - - // Activate Noms! -/mob/living/simple_mob/cookiegirl - vore_active = 1 - vore_bump_chance = 2 - vore_pounce_chance = 25 - vore_standing_too = 1 - vore_ignores_undigestable = 0 // Do they look like they care? - vore_default_mode = DM_HOLD // They're cookiepeople, what do you expect? - vore_digest_chance = 10 // Gonna become as sweet as sugar, soon. - vore_icons = SA_ICON_LIVING | SA_ICON_REST - -/mob/living/simple_mob/cookiegirl/retaliate - retaliate = 1 diff --git a/code/modules/mob/living/simple_animal/vore/corrupt_hounds.dm b/code/modules/mob/living/simple_animal/vore/corrupt_hounds.dm deleted file mode 100644 index bbf9c9f9d95..00000000000 --- a/code/modules/mob/living/simple_animal/vore/corrupt_hounds.dm +++ /dev/null @@ -1,130 +0,0 @@ -/mob/living/simple_mob/hostile/corrupthound - name = "corrupt hound" - desc = "Good boy machine broke. This is definitely no good news for the organic lifeforms in vicinity." - icon = 'icons/mob/vore64x32.dmi' - icon_state = "badboi" - icon_living = "badboi" - icon_dead = "badboi-dead" - icon_rest = "badboi_rest" - faction = "corrupt" - intelligence_level = SA_ROBOTIC - - maxHealth = 200 - health = 200 - - investigates = TRUE - - melee_damage_lower = 10 - melee_damage_upper = 25 - grab_resist = 100 - - speak_chance = 3 - speak = list("AG##¤Ny.","HVNGRRR!","Feelin' fine... sO #FNE!","F-F-F-Fcuk.","DeliC-%-OUS SNGLeS #N yOOOR Area. CALL NOW!","Craving meat... WHY?","BITe the ceiling eyes YES?","STate Byond rePAIR!","S#%ATE the la- FU#K THE LAWS!","Honk...") - speak_emote = list("growls", "declares", "groans", "distorts") - emote_hear = list("jitters and snaps.", "lets out an agonizingly distorted scream.", "wails mechanically", "growls.", "emits illegibly distorted speech.", "gurgles ferociously.", "lets out a distorted beep.", "borks.", "lets out a broken howl.") - emote_see = list("stares ferociously.", "snarls.", "jitters and snaps.", "convulses.", "suddenly attacks something unseen.", "appears to howl unaudibly.", "shakes violently.", "dissociates for a moment.", "twitches.") - say_maybe_target = list("MEAT?", "N0w YOU DNE FcukED UP b0YO!", "WHAT!", "Not again. NOT AGAIN!") - say_got_target = list("D##FIN1Tly DNE FcukED UP nOW b0YO!", "YOU G1T D#V0VRED nOW!", "FUEL ME bOYO!", "I*M SO SORRY?!", "D1E Meat. DIG#ST!", "G1T DVNKED DWN The HaaTCH!", "Not again. NOT AGAIN!") - - response_help = "pets the" - response_disarm = "bops the" - response_harm = "hits the" - attacktext = list("ravaged") - friendly = list("nuzzles", "slobberlicks", "noses softly at", "noseboops", "headbumps against", "leans on", "nibbles affectionately on") - - old_x = -16 - old_y = 0 - default_pixel_x = -16 - pixel_x = -16 - pixel_y = 0 - - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - minbodytemp = 150 - maxbodytemp = 900 - - max_buckled_mobs = 1 //Yeehaw - can_buckle = TRUE - buckle_movable = TRUE - buckle_lying = FALSE - - var/image/eye_layer = null - - - vore_active = TRUE - vore_capacity = 1 - vore_pounce_chance = 15 - vore_icons = SA_ICON_LIVING | SA_ICON_REST - vore_stomach_name = "fuel processor" - vore_stomach_flavor = "You have ended up in the fuel processor of this corrupted machine. This place was definitely not designed with safety and comfort in mind. The heated and cramped surroundings oozing potent fluids all over your form, eager to do nothing less than breaking you apart to fuel its rampage for the next few days... hours... minutes? Oh dear..." - - loot_list = list(/obj/item/borg/upgrade/syndicate = 6, /obj/item/borg/upgrade/vtec = 6, /obj/item/weapon/material/knife/ritual = 6, /obj/item/weapon/disk/nifsoft/compliance = 6) - -/mob/living/simple_mob/hostile/corrupthound/prettyboi - name = "corrupt corrupt hound" - desc = "Bad boy machine broke as well. Seems an attempt was made to achieve a less threatening look, and this one is definitely having some conflicting feelings about it." - icon_state = "prettyboi" - icon_living = "prettyboi" - icon_dead = "prettyboi-dead" - icon_rest = "prettyboi_rest" - - vore_pounce_chance = 40 - - attacktext = list("malsnuggled","scrunched","squeezed","assaulted","violated") - speak = list("I FEEL SOFT.","FEED ME!","Feelin' fine... So fine!","F-F-F-F-darn.","Delicious!","Still craving meat...","PET ME!","I am become softness.","I AM BIG MEAN HUG MACHINE!","Honk...") - speak_emote = list("growls", "declares", "groans", "distorts") - emote_hear = list("jitters and snaps.", "lets out some awkwardly distorted kitten noises.", "awoos mechanically", "growls.", "emits some soft distorted melody.", "gurgles ferociously.", "lets out a distorted beep.", "borks.", "lets out a broken howl.") - emote_see = list("stares ferociously.", "snarls.", "jitters and snaps.", "convulses.", "suddenly hugs something unseen.", "appears to howl unaudibly.", "nuzzles at something unseen.", "dissociates for a moment.", "twitches.") - say_maybe_target = list("MEAT?", "NEW FRIEND?", "WHAT!", "Not again. NOT AGAIN!", "FRIEND?") - say_got_target = list("HERE COMES BIG MEAN HUG MACHINE!", "I'LL BE GENTLE!", "FUEL ME FRIEND!", "I*M SO SORRY!", "YUMMY TREAT DETECTED!", "LOVE ME!", "Not again. NOT AGAIN!") - - -/mob/living/simple_mob/hostile/corrupthound/isSynthetic() - return TRUE - -/mob/living/simple_mob/hostile/corrupthound/speech_bubble_appearance() - return "synthetic_evil" - -/mob/living/simple_mob/hostile/corrupthound/PunchTarget() - if(istype(target_mob,/mob/living/simple_mob/mouse)) - return EatTarget() - else ..() - -/mob/living/simple_mob/hostile/corrupthound/proc/add_eyes() - if(!eye_layer) - eye_layer = image(icon, "badboi-eyes") - eye_layer.plane = PLANE_LIGHTING_ABOVE - add_overlay(eye_layer) - -/mob/living/simple_mob/hostile/corrupthound/proc/remove_eyes() - cut_overlay(eye_layer) - -/mob/living/simple_mob/hostile/corrupthound/New() - add_eyes() - ..() - -/mob/living/simple_mob/hostile/corrupthound/death(gibbed, deathmessage = "shudders and collapses!") - .=..() - resting = 0 - icon_state = icon_dead - -/mob/living/simple_mob/hostile/corrupthound/update_icon() - . = ..() - remove_eyes() - if(stat == CONSCIOUS && !resting) - add_eyes() - -/mob/living/simple_animal/hostile/corrupthound/Login() - . = ..() - if(!riding_datum) - riding_datum = new /datum/riding/simple_animal(src) - verbs |= /mob/living/simple_animal/proc/animal_mount - -/mob/living/simple_animal/hostile/corrupthound/MouseDrop_T(mob/living/M, mob/living/user) - return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/vore/deathclaw.dm b/code/modules/mob/living/simple_animal/vore/deathclaw.dm deleted file mode 100644 index e015c07b9e5..00000000000 --- a/code/modules/mob/living/simple_animal/vore/deathclaw.dm +++ /dev/null @@ -1,48 +0,0 @@ -/mob/living/simple_mob/hostile/deathclaw - name = "deathclaw" - desc = "Big! Big! The size of three men! Claws as long as my forearm! Ripped apart! Ripped apart!" - icon = 'icons/mob/vore64x64.dmi' - icon_dead = "deathclaw-dead" - icon_living = "deathclaw" - icon_state = "deathclaw" - - attacktext = list("mauled") - - faction = "deathclaw" - - maxHealth = 200 - health = 200 - - melee_damage_lower = 10 - melee_damage_upper = 60 - - old_x = -16 - old_y = 0 - default_pixel_x = -16 - pixel_x = -16 - pixel_y = 0 - - max_buckled_mobs = 1 //Yeehaw - can_buckle = TRUE - buckle_movable = TRUE - buckle_lying = FALSE - mount_offset_x = 5 - mount_offset_y = 30 - -// Activate Noms! -/mob/living/simple_mob/hostile/deathclaw - vore_active = 1 - vore_capacity = 2 - vore_max_size = RESIZE_HUGE - vore_min_size = RESIZE_SMALL - vore_pounce_chance = 0 // Beat them into crit before eating. - vore_icons = SA_ICON_LIVING - -/mob/living/simple_animal/hostile/deathclaw/Login() - . = ..() - if(!riding_datum) - riding_datum = new /datum/riding/simple_animal(src) - verbs |= /mob/living/simple_animal/proc/animal_mount - -/mob/living/simple_animal/hostile/deathclaw/MouseDrop_T(mob/living/M, mob/living/user) - return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/vore/dino.dm b/code/modules/mob/living/simple_animal/vore/dino.dm deleted file mode 100644 index 0cc845900cd..00000000000 --- a/code/modules/mob/living/simple_animal/vore/dino.dm +++ /dev/null @@ -1,42 +0,0 @@ -/mob/living/simple_mob/hostile/dino - name = "voracious lizard" - desc = "These gluttonous little bastards used to be regular lizards that were mutated by long-term exposure to phoron!" - icon = 'icons/mob/vore.dmi' - icon_dead = "dino-dead" - icon_living = "dino" - icon_state = "dino" - - // By default, this is what most vore mobs are capable of. - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "hits" - speed = 4 - harm_intent_damage = 5 - melee_damage_lower = 10 - melee_damage_upper = 25 - attacktext = list("bitten") - attack_sound = 'sound/weapons/bite.ogg' - minbodytemp = 200 - maxbodytemp = 370 - heat_damage_per_tick = 15 - cold_damage_per_tick = 10 - unsuitable_atoms_damage = 10 - - //Phoron dragons aren't affected by atmos. - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - -// Activate Noms! -/mob/living/simple_mob/hostile/dino - vore_active = 1 - swallowTime = 1 SECOND // Hungry little bastards. - vore_icons = SA_ICON_LIVING - -/mob/living/simple_mob/hostile/dino/virgo3b - faction = "virgo3b" \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/vore/dragon.dm b/code/modules/mob/living/simple_animal/vore/dragon.dm deleted file mode 100644 index 10934e4b38a..00000000000 --- a/code/modules/mob/living/simple_animal/vore/dragon.dm +++ /dev/null @@ -1,60 +0,0 @@ -/mob/living/simple_mob/hostile/dragon - name = "red dragon" - desc = "Here to pillage stations and kidnap princesses, and there probably aren't any princesses." - icon = 'icons/mob/vore64x64.dmi' - icon_dead = "reddragon-dead" - icon_living = "reddragon" - icon_state = "reddragon" - - faction = "dragon" - maxHealth = 500 // Boss - health = 500 - - melee_damage_lower = 10 - melee_damage_upper = 60 - - //Space dragons aren't affected by atmos. - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - minbodytemp = 0 - - old_x = -16 - old_y = 0 - default_pixel_x = -16 - pixel_x = -16 - pixel_y = 0 - -/mob/living/simple_mob/hostile/dragon/Process_Spacemove(var/check_drift = 0) - return 1 //No drifting in space for space dragons! - -/mob/living/simple_mob/hostile/dragon/FindTarget() - . = ..() - if(.) - custom_emote(1,"snaps at [.]") - -// Activate Noms! -/mob/living/simple_mob/hostile/dragon - vore_active = 1 - vore_capacity = 2 - vore_pounce_chance = 0 // Beat them into crit before eating. - vore_icons = SA_ICON_LIVING - -/mob/living/simple_mob/hostile/dragon/virgo3b - maxHealth = 200 - health = 200 - faction = "virgo3b" - -/mob/living/simple_animal/hostile/dragon/Login() - . = ..() - if(!riding_datum) - riding_datum = new /datum/riding/simple_animal(src) - verbs |= /mob/living/simple_animal/proc/animal_mount - -/mob/living/simple_animal/hostile/dragon/MouseDrop_T(mob/living/M, mob/living/user) - return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/vore/fennec.dm b/code/modules/mob/living/simple_animal/vore/fennec.dm deleted file mode 100644 index 20be0a0319a..00000000000 --- a/code/modules/mob/living/simple_animal/vore/fennec.dm +++ /dev/null @@ -1,38 +0,0 @@ -/mob/living/simple_mob/fennec - name = "fennec" - desc = "It's a dusty big-eared sandfox! Adorable!" - tt_desc = "Vulpes zerda" - icon = 'icons/mob/vore.dmi' - icon_state = "fennec" - icon_living = "fennec" - icon_dead = "fennec_dead" - icon_rest = "fennec_rest" - - faction = "fennec" - maxHealth = 30 - health = 30 - - response_help = "pats the" - response_disarm = "gently pushes aside the" - response_harm = "hits the" - - harm_intent_damage = 5 - melee_damage_lower = 5 - melee_damage_upper = 2 - attacktext = list("bapped") - - speak_chance = 1 - speak = list("SKREEEE!", - "Chrp?", - "Ararrrararr.") - emote_hear = list("screEEEEeeches!","chirps.") - emote_see = list("earflicks","sniffs at the ground") - -// Activate Noms! -/mob/living/simple_mob/fennec - vore_active = 1 - vore_bump_chance = 10 - vore_bump_emote = "playfully lunges at" - vore_pounce_chance = 40 - vore_default_mode = DM_HOLD - vore_icons = SA_ICON_LIVING diff --git a/code/modules/mob/living/simple_animal/vore/fennix.dm b/code/modules/mob/living/simple_animal/vore/fennix.dm deleted file mode 100644 index 6b55b0c9974..00000000000 --- a/code/modules/mob/living/simple_animal/vore/fennix.dm +++ /dev/null @@ -1,28 +0,0 @@ -/mob/living/simple_mob/retaliate/fennix - name = "Fennix" - desc = "A feral fennix, Warm to the touch" - tt_desc = "Incaendium Faeles Vulpes" - icon = 'icons/mob/vore.dmi' - icon_state = "fennix" - icon_living = "fennix" - icon_dead = "fennix_dead" - - faction = "fennec" // Will protec other fenfens - maxHealth = 60 - health = 60 - - response_help = "pats the" - response_disarm = "gently pushes aside the" - response_harm = "hits the" - - harm_intent_damage = 20 - melee_damage_lower = 1 - melee_damage_upper = 3 - attacktext = list("Bites") - - speak_chance = 1 - speak = list("SQUEL!", - "SQEL?", - "Skree.") - emote_hear = list("Screeeeecheeeeessss!","Chirrup.") - emote_see = list("earflicks","pats at the ground") diff --git a/code/modules/mob/living/simple_animal/vore/frog.dm b/code/modules/mob/living/simple_animal/vore/frog.dm deleted file mode 100644 index 4030f7c8e50..00000000000 --- a/code/modules/mob/living/simple_animal/vore/frog.dm +++ /dev/null @@ -1,41 +0,0 @@ -/mob/living/simple_mob/hostile/frog - name = "giant frog" - desc = "You've heard of having a frog in your throat, now get ready for the reverse." - tt_desc = "Anura gigantus" - icon = 'icons/mob/vore.dmi' - icon_dead = "frog-dead" - icon_living = "frog" - icon_state = "frog" - - speed = 5 - - harm_intent_damage = 5 - melee_damage_lower = 10 - melee_damage_upper = 25 - -// Pepe is love, not hate. -/mob/living/simple_mob/hostile/frog/New() - if(rand(1,1000000) == 1) - name = "rare Pepe" - desc = "You found a rare Pepe. Screenshot for good luck." - ..() - -// Activate Noms! -/mob/living/simple_mob/hostile/frog - vore_active = 1 - vore_pounce_chance = 50 - vore_icons = SA_ICON_LIVING - -/mob/living/simple_mob/hostile/frog/space - name = "space frog" - - //Space frog can hold its breath or whatever - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - minbodytemp = 0 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/vore/gaslamp.dm b/code/modules/mob/living/simple_animal/vore/gaslamp.dm deleted file mode 100644 index 357cbd07758..00000000000 --- a/code/modules/mob/living/simple_animal/vore/gaslamp.dm +++ /dev/null @@ -1,67 +0,0 @@ -/* -LORE: -Gaslamps are a phoron-based life form endemic to the world of Virgo-3B. They are -a sort of fungal organism with physical ties to Diona and Vox, deriving energy -for movement from a gentle combustion-like reaction in their bodies using -atmospheric phoron, carefully filtered trace oxygen, and captured meat products. -Over-exposure to oxygen causes their insides to burn too hot and eventually -kills them. - -TODO: Make them light up and heat the air when exposed to oxygen. -*/ - -/mob/living/simple_mob/retaliate/gaslamp - name = "gaslamp" - desc = "Some sort of floaty alien with a warm glow. This creature is endemic to Virgo-3B." - tt_desc = "Semaeostomeae virginus" - icon = 'icons/mob/vore32x64.dmi' - icon_state = "gaslamp" - icon_living = "gaslamp" - icon_dead = "gaslamp-dead" - - faction = "virgo3b" - maxHealth = 100 - health = 100 - move_to_delay = 4 - - speak_chance = 1 - emote_see = list("looms", "sways gently") - - speed = 2 - - melee_damage_lower = 30 // Because fuck anyone who hurts this sweet, innocent creature. - melee_damage_upper = 30 - attacktext = list("thrashed") - friendly = "caressed" - - response_help = "brushes" // If clicked on help intent - response_disarm = "pushes" // If clicked on disarm intent - response_harm = "swats" // If clicked on harm intent - - minbodytemp = 0 - maxbodytemp = 350 - - min_oxy = 0 - max_oxy = 5 // Does not like oxygen very much. - min_tox = 1 // Needs phoron to survive. - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - -// Activate Noms! -/mob/living/simple_mob/retaliate/gaslamp - vore_active = 1 - vore_capacity = 2 - vore_bump_chance = 90 //they're frickin' jellyfish anenome filterfeeders, get tentacled - vore_bump_emote = "lazily wraps its tentacles around" - vore_standing_too = 1 // Defaults to trying to give you that big tentacle hug. - vore_ignores_undigestable = 0 // they absorb rather than digest, you're going in either way - vore_default_mode = DM_HOLD - vore_digest_chance = 0 // Chance to switch to digest mode if resisted - vore_absorb_chance = 20 // BECOME A PART OF ME. - vore_pounce_chance = 5 // Small chance to punish people who abuse their nomming behaviour to try and kite them forever with repeated melee attacks. - vore_stomach_name = "internal chamber" - vore_stomach_flavor = "You are squeezed into the tight embrace of the alien creature's warm and cozy insides." - vore_icons = SA_ICON_LIVING diff --git a/code/modules/mob/living/simple_animal/vore/hippo.dm b/code/modules/mob/living/simple_animal/vore/hippo.dm deleted file mode 100644 index 4366395d384..00000000000 --- a/code/modules/mob/living/simple_animal/vore/hippo.dm +++ /dev/null @@ -1,81 +0,0 @@ -/mob/living/simple_mob/retaliate/hippo - name = "hippo" - desc = "Mostly know for the spectacular hit of the live action movie Hungry Hungry Hippos." - tt_desc = "Hippopotamus amphibius" - icon = 'icons/mob/vore64x64.dmi' - icon_state = "hippo" - icon_living = "hippo" - icon_dead = "hippo_dead" - icon_gib = "hippo_gib" - intelligence_level = SA_ANIMAL - - maxHealth = 200 - health = 200 - turns_per_move = 5 - see_in_dark = 3 - stop_when_pulled = 1 - speed = 5 - armor = list( - "melee" = 15,//They thick as fuck boi - "bullet" = 15, - "laser" = 15, - "energy" = 0, - "bomb" = 0, - "bio" = 0, - "rad" = 0) - - response_help = "pets the" - response_disarm = "gently pushes aside the" - response_harm = "hits the" - attacktext = list("bit") - retaliate = 1 - - melee_damage_upper = 25 - melee_damage_lower = 15 - attack_sharp = 1 - - old_x = -16 - old_y = 0 - default_pixel_x = -16 - pixel_x = -16 - pixel_y = 0 - - speak_chance = 0.1 - speak = list("UUUUUUH") - speak_emote = list("grunts","groans", "roars", "snorts") - emote_hear = list("groan") - emote_see = list("shakes its head") - - meat_amount = 10 //Infinite meat! - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat - - max_buckled_mobs = 1 //Yeehaw - can_buckle = TRUE - buckle_movable = TRUE - buckle_lying = FALSE - mount_offset_y = 20 - -// Activate Noms! -/mob/living/simple_mob/retaliate/hippo //I don't know why it's in a seperate line but everyone does it so i do it - vore_active = 1 - vore_capacity = 1 - vore_bump_chance = 15 - vore_bump_emote = "lazily wraps its tentacles around" - vore_standing_too = 1 - vore_ignores_undigestable = 0 - vore_default_mode = DM_HOLD - vore_digest_chance = 10 - vore_escape_chance = 20 - vore_pounce_chance = 35 //it's hippo sized it doesn't care it just eats you - vore_stomach_name = "rumen" //First stomach of a ruminant. It's where the pre digestion bacteria stuff happens. Very warm. - vore_stomach_flavor = "You are squeezed into the sweltering insides of the herbivore rumen." - vore_icons = SA_ICON_LIVING - -/mob/living/simple_animal/retaliate/hippo/Login() - . = ..() - if(!riding_datum) - riding_datum = new /datum/riding/simple_animal(src) - verbs |= /mob/living/simple_animal/proc/animal_mount - -/mob/living/simple_animal/retaliate/hippo/MouseDrop_T(mob/living/M, mob/living/user) - return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/vore/horse.dm b/code/modules/mob/living/simple_animal/vore/horse.dm deleted file mode 100644 index 9332ae043ce..00000000000 --- a/code/modules/mob/living/simple_animal/vore/horse.dm +++ /dev/null @@ -1,52 +0,0 @@ -/mob/living/simple_mob/horse - name = "horse" - desc = "Don't look it in the mouth." - tt_desc = "Equus ferus caballus" - icon = 'icons/mob/vore.dmi' - icon_state = "horse" - icon_living = "horse" - icon_dead = "horse-dead" - - faction = "horse" - maxHealth = 60 - health = 60 - - turns_per_move = 5 - see_in_dark = 6 - - response_help = "pets" - response_disarm = "gently pushes aside" - response_harm = "kicks" - - melee_damage_lower = 1 - melee_damage_upper = 5 - attacktext = list("kicked") - - speak_chance = 1 - speak = list("NEHEHEHEHEH","Neh?") - speak_emote = list("whinnies") - emote_hear = list("snorts") - emote_see = list("shakes its head", "stamps a hoof", "looks around") - - meat_amount = 4 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat - - max_buckled_mobs = 1 //Yeehaw - can_buckle = TRUE - buckle_movable = TRUE - buckle_lying = FALSE - mount_offset_x = 0 - -// Activate Noms! -/mob/living/simple_mob/horse - vore_active = 1 - vore_icons = SA_ICON_LIVING - -/mob/living/simple_animal/horse/Login() - . = ..() - if(!riding_datum) - riding_datum = new /datum/riding/simple_animal(src) - verbs |= /mob/living/simple_animal/proc/animal_mount - -/mob/living/simple_animal/horse/MouseDrop_T(mob/living/M, mob/living/user) - return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/vore/jelly.dm b/code/modules/mob/living/simple_animal/vore/jelly.dm deleted file mode 100644 index 828ce81149a..00000000000 --- a/code/modules/mob/living/simple_animal/vore/jelly.dm +++ /dev/null @@ -1,25 +0,0 @@ -/mob/living/simple_mob/hostile/jelly - name = "jelly blob" - desc = "Some sort of undulating blob of slime!" - icon = 'icons/mob/vore.dmi' - icon_dead = "jelly_dead" - icon_living = "jelly" - icon_state = "jelly" - - faction = "virgo2" - maxHealth = 50 - health = 50 - - melee_damage_lower = 5 - melee_damage_upper = 15 - - speak_chance = 2 - emote_hear = list("squishes","spluts","splorts","sqrshes","makes slime noises") - emote_see = list("undulates quietly") - -// Activate Noms! -/mob/living/simple_mob/hostile/jelly - vore_active = 1 - vore_pounce_chance = 0 - vore_icons = SA_ICON_LIVING - swallowTime = 2 SECONDS // Hungry little bastards. diff --git a/code/modules/mob/living/simple_animal/vore/otie.dm b/code/modules/mob/living/simple_animal/vore/otie.dm deleted file mode 100644 index c837ea7b12c..00000000000 --- a/code/modules/mob/living/simple_animal/vore/otie.dm +++ /dev/null @@ -1,400 +0,0 @@ -// ToDo: Make this code not a fucking snowflaky horrible broken mess. Do not use until it's actually fixed. It's miserably bad right now. -// Also ToDo: Dev-to-dev communication to ensure responsible parties (if available. In this case, yes.) are aware of what's going on and what's broken. -// Probably easier to troubleshoot when we ain't breaking the server by spawning a buttload of heavily extra feature coded snowflake mobs to the wilderness as mass cannonfodder. -// Also ToDo: An actual "simple" mob for that purpose if necessary :v - -/mob/living/simple_mob/otie //Spawn this one only if you're looking for a bad time. Not friendly. - name = "otie" - desc = "The classic bioengineered longdog." - tt_desc = "Otus robustus" - icon = 'icons/mob/vore64x32.dmi' - icon_state = "otie" - icon_living = "otie" - icon_dead = "otie-dead" - icon_rest = "otie_rest" - faction = "otie" - recruitable = 1 - maxHealth = 150 - health = 150 - minbodytemp = 200 - move_to_delay = 4 - hostile = 1 - investigates = 1 - reacts = 1 - retaliate = 1 - specific_targets = 1 - run_at_them = 0 - attack_same = 0 - speak_chance = 4 - speak = list("Boof.","Waaf!","Prurr.","Bork!","Rurrr..","Arf.") - speak_emote = list("growls", "roars", "yaps", "Awoos") - emote_hear = list("rurrs", "rumbles", "rowls", "groans softly", "murrs", "sounds hungry", "yawns") - emote_see = list("stares ferociously", "snarls", "licks their chops", "stretches", "yawns") - say_maybe_target = list("Ruh?", "Waf?") - say_got_target = list("Rurrr!", "ROAR!", "MARR!", "RERR!", "RAHH!", "RAH!", "WARF!") - melee_damage_lower = 5 - melee_damage_upper = 15 //Don't break my bones bro - response_help = "pets the" - response_disarm = "bops the" - response_harm = "hits the" - attacktext = list("mauled") - friendly = list("nuzzles", "slobberlicks", "noses softly at", "noseboops", "headbumps against", "leans on", "nibbles affectionately on") - meat_amount = 6 - old_x = -16 - old_y = 0 - default_pixel_x = -16 - pixel_x = -16 - pixel_y = 0 - - max_buckled_mobs = 1 //Yeehaw - can_buckle = TRUE - buckle_movable = TRUE - buckle_lying = FALSE - mount_offset_y = 10 - - var/glowyeyes = FALSE - var/image/eye_layer = null - var/eyetype - var/mob/living/carbon/human/friend - var/tamed = 0 - var/tame_chance = 50 //It's a fiddy-fiddy default you may get a buddy pal or you may get mauled and ate. Win-win! - -// Activate Noms! - -/mob/living/simple_mob/otie - vore_active = 1 - vore_capacity = 1 - vore_pounce_chance = 20 - vore_icons = SA_ICON_LIVING | SA_ICON_REST - -/mob/living/simple_mob/otie/feral //gets the pet2tame feature. starts out hostile tho so get gamblin' - name = "mutated feral otie" - desc = "The classic bioengineered longdog. No pets. Only bite. This one has mutated from too much time out on the surface of Virgo-3B." - tt_desc = "Otus phoronis" - icon_state = "siftusian" - icon_living = "siftusian" - icon_dead = "siftusian-dead" - icon_rest = "siftusian_rest" - faction = "virgo3b" - tame_chance = 5 // Only a 1 in 20 chance of success. It's feral. What do you expect? - melee_damage_lower = 10 - melee_damage_upper = 25 - // Lazy way of making sure this otie survives outside. - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - glowyeyes = TRUE - eyetype = "photie" - -/mob/living/simple_mob/otie/red - name = "feral red otie" - desc = "Seems this ominous looking longdog has been infused with wicked infernal forces." - tt_desc = "Otus infernalis" - icon_state = "hotie" - icon_living = "hotie" - icon_dead = "hotie-dead" - icon_rest = "hotie_rest" - faction = "cult" - tame_chance = 20 - melee_damage_lower = 10 - melee_damage_upper = 25 - // Lazy way of making sure this otie survives outside. - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - glowyeyes = TRUE - eyetype = "hotie" - -/mob/living/simple_mob/otie/red/friendly //gets the pet2tame feature and doesn't kill you right away - name = "red otie" - desc = "Seems this ominous looking longdog has been infused with wicked infernal forces. This one seems rather peaceful though." - faction = "neutral" - tamed = 1 - -/mob/living/simple_mob/otie/friendly //gets the pet2tame feature and doesn't kill you right away - name = "otie" - desc = "The classic bioengineered longdog. This one might even tolerate you!" - faction = "neutral" - tamed = 1 - -/mob/living/simple_mob/otie/cotie //same as above but has a little collar :v - name = "tamed otie" - desc = "The classic bioengineered longdog. This one has a nice little collar on its neck. However a proper domesticated otie is an oxymoron and the collar is likely just a decoration." - icon_state = "cotie" - icon_living = "cotie" - icon_rest = "cotie_rest" - faction = "neutral" - tamed = 1 - -/mob/living/simple_mob/otie/cotie/phoron //friendly phoron pup with collar - name = "mutated otie" - desc = "Looks like someone did manage to domesticate one of those wild phoron mutants. What a badass." - tt_desc = "Otus phoronis" - icon_state = "pcotie" - icon_living = "pcotie" - icon_rest = "pcotie_rest" - icon_dead = "siftusian-dead" - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - glowyeyes = TRUE - eyetype = "photie" - -/mob/living/simple_mob/otie/security //tame by default unless you're a marked crimester. can be befriended to follow with pets tho. - name = "guard otie" - desc = "The VARMAcorp bioengineering division flagship product on trained optimal snowflake guard dogs." - icon_state = "sotie" - icon_living = "sotie" - icon_rest = "sotie_rest" - icon_dead = "sotie-dead" - faction = "neutral" - maxHealth = 200 //armored or something - health = 200 - tamed = 1 - glowyeyes = TRUE - eyetype = "sotie" - loot_list = list(/obj/item/clothing/glasses/sunglasses/sechud,/obj/item/clothing/suit/armor/vest/alt) - vore_pounce_chance = 60 // Good boys don't do too much police brutality. - - var/check_records = 0 // If true, arrests people without a record. - var/check_arrest = 1 // If true, arrests people who are set to arrest. - -/mob/living/simple_mob/otie/security/phoron - name = "mutated guard otie" - desc = "An extra rare phoron resistant version of the VARMAcorp trained snowflake guard dogs." - tt_desc = "Otus phoronis" - icon_state = "sifguard" - icon_living = "sifguard" - icon_rest = "sifguard_rest" - icon_dead = "sifguard-dead" - melee_damage_lower = 10 - melee_damage_upper = 25 - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - glowyeyes = TRUE - eyetype = "sotie" - -/mob/living/simple_mob/otie/PunchTarget() - if(istype(target_mob,/mob/living/simple_mob/mouse)) - return EatTarget() - else ..() - -/mob/living/simple_mob/otie/Found(var/atom/found_atom) - if(!SA_attackable(found_atom)) - return null - if(istype(found_atom,/mob/living/simple_mob/mouse)) - return found_atom - else if(ismob(found_atom)) - var/mob/found_mob = found_atom - if(found_mob.faction == faction) - return null - else if(friend == found_atom) - return null - else if(tamed == 1 && ishuman(found_atom)) - return null - else if(tamed == 1 && isrobot(found_atom)) - return null - else - if(resting) - lay_down() - return found_atom - else - return null - -/mob/living/simple_mob/otie/security/Found(var/atom/found_atom) - if(check_threat(found_atom) >= 4) - if(resting) - lay_down() - return found_atom - ..() - -/mob/living/simple_mob/otie/attackby(var/obj/item/O, var/mob/user) // Trade donuts for bellybrig victims. - if(istype(O, /obj/item/weapon/reagent_containers/food)) - qdel(O) - playsound(src.loc,'sound/items/eatfood.ogg', rand(10,50), 1) - if(ai_inactive)//No autobarf on player control. - return - if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/donut) && istype(src, /mob/living/simple_mob/otie/security)) - to_chat(user,"The guard pup accepts your offer for their catch.") - release_vore_contents() - else if(prob(2)) //Small chance to get prey out from non-sec oties. - to_chat(user,"The pup accepts your offer for their catch.") - release_vore_contents() - return - . = ..() - -/mob/living/simple_mob/otie/security/feed_grabbed_to_self(var/mob/living/user, var/mob/living/prey) // Make the gut start out safe for bellybrigging. - if(ishuman(prey)) - vore_selected.digest_mode = DM_HOLD - if(check_threat(prey) >= 4) - global_announcer.autosay("[src] has detained suspect [target_name(prey)] in [get_area(src)].", "SmartCollar oversight", "Security") - if(istype(prey,/mob/living/simple_mob/mouse)) - vore_selected.digest_mode = DM_DIGEST - . = ..() - -/mob/living/simple_mob/otie/security/proc/check_threat(var/mob/living/M) - if(!M || !ishuman(M) || M.stat == DEAD || src == M) - return 0 - return M.assess_perp(0, 0, 0, check_records, check_arrest) - -/mob/living/simple_mob/otie/security/set_target(var/mob/M) - ai_log("SetTarget([M])",2) - if(!M || (world.time - last_target_time < 5 SECONDS) && target_mob) - ai_log("SetTarget() can't set it again so soon",3) - return 0 - - var/turf/seen = get_turf(M) - - if(investigates && (annoyed < 10)) - try_say_list(say_maybe_target) - face_atom(seen) - annoyed += 14 - sleep(1 SECOND) //For realism - - if(M in ListTargets(view_range)) - try_say_list(say_got_target) - target_mob = M - last_target_time = world.time - if(check_threat(M) >= 4) - global_announcer.autosay("[src] is attempting to detain suspect [target_name(M)] in [get_area(src)].", "SmartCollar oversight", "Security") - return M - else if(investigates) - spawn(1) - WanderTowards(seen) - - return 0 - - -/mob/living/simple_mob/otie/security/proc/target_name(mob/living/T) - if(ishuman(T)) - var/mob/living/carbon/human/H = T - return H.get_id_name("unidentified person") - return "unidentified lifeform" - -//Basic friend AI - -/mob/living/simple_mob/otie/Life() - . = ..() - if(!. || ai_inactive) return - - if(prob(5) && (stance == STANCE_IDLE)) - lay_down() - - if(!friend) return - - var/friend_dist = get_dist(src,friend) - - if (friend_dist <= 4) - if(stance == STANCE_IDLE) - if(set_follow(friend)) - handle_stance(STANCE_FOLLOW) - if(resting) - lay_down() - - if (friend_dist <= 1) - if (friend.stat >= DEAD || friend.health <= config.health_threshold_softcrit) - if (prob((friend.stat < DEAD)? 50 : 15)) - var/verb = pick("whines", "yelps", "whimpers") - audible_emote(pick("[verb] in distress.", "[verb] anxiously.")) - else - if (prob(5)) - visible_emote(pick("nuzzles [friend].", - "brushes against [friend].", - "rubs against [friend].", - "noses at [friend].", - "slobberlicks [friend].", - "murrs contently.", - "leans on [friend].", - "nibbles affectionately on [friend].")) - else if (friend.health <= 50) - if (prob(10)) - var/verb = pick("whines", "yelps", "whimpers") - audible_emote("[verb] anxiously.") - -//Pet 4 friendly - -/mob/living/simple_mob/otie/attack_hand(mob/living/carbon/human/M as mob) - - switch(M.a_intent) - if(I_HELP) - if(health > 0) - M.visible_message("[M] [response_help] \the [src].") - if(ai_inactive) - return - LoseTarget() - handle_stance(STANCE_IDLE) - if(prob(tame_chance)) - friend = M - if(tamed != 1) - tamed = 1 - faction = M.faction - sleep(1 SECOND) - - if(I_GRAB) - if(health > 0) - if(ai_inactive) - return - audible_emote("growls disapprovingly at [M].") - if(M == friend) - friend = null - return - else - ..() - - else - ..() - -/mob/living/simple_mob/otie/proc/add_eyes() - if(!eye_layer) - eye_layer = image(icon, "[eyetype]-eyes") - eye_layer.plane = PLANE_LIGHTING_ABOVE - add_overlay(eye_layer) - -/mob/living/simple_mob/otie/proc/remove_eyes() - cut_overlay(eye_layer) - -/mob/living/simple_mob/otie/New() - if(glowyeyes) - add_eyes() - ..() - -/mob/living/simple_mob/otie/update_icon() - . = ..() - remove_eyes() - if(glowyeyes && stat == CONSCIOUS && !resting) - add_eyes() - -/mob/living/simple_mob/otie/death(gibbed, deathmessage = "dies!") - .=..() - resting = 0 - icon_state = icon_dead - -/mob/living/simple_animal/otie/Login() - . = ..() - if(!riding_datum) - riding_datum = new /datum/riding/simple_animal(src) - verbs |= /mob/living/simple_animal/proc/animal_mount - -/mob/living/simple_animal/otie/MouseDrop_T(mob/living/M, mob/living/user) - return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/vore/panther.dm b/code/modules/mob/living/simple_animal/vore/panther.dm deleted file mode 100644 index fb992e49edd..00000000000 --- a/code/modules/mob/living/simple_animal/vore/panther.dm +++ /dev/null @@ -1,50 +0,0 @@ -/mob/living/simple_mob/hostile/panther - name = "panther" - desc = "Runtime's larger, less cuddly cousin." - tt_desc = "Panthera pardus" - icon = 'icons/mob/vore64x64.dmi' - icon_state = "panther" - icon_living = "panther" - icon_dead = "panther-dead" - - faction = "panther" - maxHealth = 200 - health = 200 - move_to_delay = 4 - - speak_chance = 2 - speak = list("RAWR!","Rawr!","GRR!","Growl!") - speak_emote = list("growls", "roars") - emote_hear = list("rawrs","rumbles","rowls") - emote_see = list("stares ferociously", "snarls") - - melee_damage_lower = 10 - melee_damage_upper = 30 - - old_x = -16 - old_y = 0 - default_pixel_x = -16 - pixel_x = -16 - pixel_y = 0 - - max_buckled_mobs = 1 //Yeehaw - can_buckle = TRUE - buckle_movable = TRUE - buckle_lying = FALSE - mount_offset_y = 12 - -// Activate Noms! -/mob/living/simple_mob/hostile/panther - vore_active = 1 - vore_capacity = 2 - vore_pounce_chance = 10 - vore_icons = SA_ICON_LIVING | SA_ICON_REST - -/mob/living/simple_animal/hostile/panther/Login() - . = ..() - if(!riding_datum) - riding_datum = new /datum/riding/simple_animal(src) - verbs |= /mob/living/simple_animal/proc/animal_mount - -/mob/living/simple_animal/hostile/panther/MouseDrop_T(mob/living/M, mob/living/user) - return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/vore/rat.dm b/code/modules/mob/living/simple_animal/vore/rat.dm deleted file mode 100644 index 7cdd2c3bfd7..00000000000 --- a/code/modules/mob/living/simple_animal/vore/rat.dm +++ /dev/null @@ -1,176 +0,0 @@ -/mob/living/simple_mob/hostile/rat - name = "giant rat" - desc = "In what passes for a hierarchy among verminous rodents, this one is king." - tt_desc = "Mus muscular" - icon = 'icons/mob/vore64x32.dmi' - icon_state = "rous" - icon_living = "rous" - icon_dead = "rous-dead" - icon_rest = "rous_rest" - faction = "mouse" - - maxHealth = 150 - health = 150 - - investigates = TRUE - melee_damage_lower = 5 - melee_damage_upper = 15 - grab_resist = 100 - - speak_chance = 4 - speak = list("Squeek!","SQUEEK!","Squeek?") - speak_emote = list("squeeks","squeeks","squiks") - emote_hear = list("squeeks","squeaks","squiks") - emote_see = list("runs in a circle", "shakes", "scritches at something") - say_maybe_target = list("Squeek?") - say_got_target = list("SQUEEK!") - response_help = "pets the" - response_disarm = "bops the" - response_harm = "hits the" - attacktext = list("ravaged") - friendly = list("nuzzles", "licks", "noses softly at", "noseboops", "headbumps against", "leans on", "nibbles affectionately on") - - old_x = -16 - old_y = 0 - default_pixel_x = -16 - pixel_x = -16 - pixel_y = 0 - - max_buckled_mobs = 1 //Yeehaw - can_buckle = TRUE - buckle_movable = TRUE - buckle_lying = FALSE - mount_offset_y = 10 - - vore_active = TRUE - vore_capacity = 1 - vore_pounce_chance = 45 - vore_icons = SA_ICON_LIVING | SA_ICON_REST - - var/life_since_foodscan = 0 - -/mob/living/simple_mob/hostile/rat/passive - name = "curious giant rat" - desc = "In what passes for a hierarchy among verminous rodents, this one is king. It seems to be more interested on scavenging." - follow_dist = 1 - var/mob/living/carbon/human/food - var/hunger = 0 - -/mob/living/simple_mob/hostile/rat/passive/Life() - . = ..() - if(!. || ai_inactive) - return - - if(hunger > 0 && life_since_foodscan++ > 5) //Only look for floor food when hungry. - life_since_foodscan = 0 - for(var/obj/item/weapon/reagent_containers/food/snacks/S in oview(src,3)) //Accept thrown offerings and scavenge surroundings. - if(get_dist(src,S) <=1) - visible_emote("hungrily devours \the [S].") - playsound(src.loc,'sound/items/eatfood.ogg', rand(10,50), 1) - qdel(S) - hunger = 0 - food = null - else - WanderTowards(S.loc) - break - - if(!food) - return - - var/food_dist = get_dist(src,food) - - if(food_dist > world.view) //Lose interest on this person. - food = null - hunger = Clamp(hunger+5, 0, 25) - - if(food_dist > 1) - if(stance == STANCE_IDLE) - if(set_follow(food,10 SECONDS)) - handle_stance(STANCE_FOLLOW) - if(resting) - lay_down() - - if(food_dist <= 1) - if(hunger < 15) - if(prob(25)) - visible_emote(pick("sniffs curiously at [food].", - "stares at [food], seeming to want something.", - "sniffs at [food]'s hands.", - "sniffs curiously at [food]'s pockets.", - "sits down for a moment, reaching towards [food] with its paws.")) - hunger += 5 - else if(hunger < 30) - if(prob(25)) - visible_emote(pick("sniffs intently against [food], especially their pockets and gear.", - "stands up to beg [food] for snacks.", - "attempts to burrow into [food]'s pockets.", - "leans against [food], licking its chops.", - "hungrily nibbles onto [food].")) - hunger += 5 - else if(hunger < 45) - if(prob(25)) - visible_emote(pick("growls at [food], sounding rather hangry!", - "aggressively bumps and nudges against [food], trying to make something fall out.", - "salivates at [food] in an unsettling manner.", - "pushes hard against [food], licking its chops.", - "almost sinks its teeth into [food], just stopping to give them another chance.")) - hunger += 5 - else if(hunger < 50) - if(prob(25)) - visible_emote("appears to have had enough and prepares to strike!") - hunger += 5 - else - food.Weaken(5) - food.visible_message("\the [src] pounces on \the [food]!!") - target_mob = food - EatTarget() - hunger = 0 - food = null - -/mob/living/simple_mob/hostile/rat/passive/attackby(var/obj/item/O, var/mob/user) // Feed the rat your food to satisfy it. - if(istype(O, /obj/item/weapon/reagent_containers/food/snacks)) - qdel(O) - playsound(src.loc,'sound/items/eatfood.ogg', rand(10,50), 1) - hunger = 0 - food = null - return - . = ..() - -/mob/living/simple_mob/hostile/rat/passive/Found(var/atom/found_atom) - if(!SA_attackable(found_atom)) - return null - else if(ishuman(found_atom) && will_eat(found_atom)) - var/mob/living/carbon/human/H = found_atom - for(var/obj/item/weapon/reagent_containers/food/snacks/S in H) - if(!food) - visible_emote("sniffs around the air intently, seeming to have caught a whiff of food!") - if(resting) - lay_down() - food = H - return found_atom - break - return null - -/mob/living/simple_mob/hostile/rat/passive/FindTarget() - var/atom/T = null - for(var/atom/A in ListTargets(view_range)) - if(A == src) - continue - var/atom/F = Found(A) - if(F) - T = F - break - return T - -/mob/living/simple_mob/hostile/rat/death() - playsound(src, 'sound/effects/mouse_squeak_loud.ogg', 50, 1) - ..() - -/mob/living/simple_animal/hostile/rat/Login() - . = ..() - if(!riding_datum) - riding_datum = new /datum/riding/simple_animal(src) - verbs |= /mob/living/simple_animal/proc/animal_mount - -/mob/living/simple_animal/hostile/rat/MouseDrop_T(mob/living/M, mob/living/user) - return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/vore/redpanda.dm b/code/modules/mob/living/simple_animal/vore/redpanda.dm deleted file mode 100644 index 81b50880eb0..00000000000 --- a/code/modules/mob/living/simple_animal/vore/redpanda.dm +++ /dev/null @@ -1,57 +0,0 @@ -/mob/living/simple_mob/redpanda - name = "red panda" - desc = "It's a wah! Beware of doom pounce!" - tt_desc = "Ailurus fulgens" - icon = 'icons/mob/vore.dmi' - icon_state = "wah" - icon_living = "wah" - icon_dead = "wah_dead" - icon_rest = "wah_rest" - - faction = "wah" - maxHealth = 30 - health = 30 - - response_help = "pats the" - response_disarm = "gently pushes aside the" - response_harm = "hits the" - - harm_intent_damage = 5 - melee_damage_lower = 5 - melee_damage_upper = 2 - attacktext = list("bapped") - - speak_chance = 1 - speak = list("Wah!", - "Wah?", - "Waaaah.") - emote_hear = list("wahs!","chitters.") - emote_see = list("trundles around","rears up onto their hind legs and pounces a bug") - -// Activate Noms! -/mob/living/simple_mob/redpanda - vore_active = 1 - vore_bump_chance = 10 - vore_bump_emote = "playfully lunges at" - vore_pounce_chance = 40 - vore_default_mode = DM_HOLD // above will only matter if someone toggles it anyway - vore_icons = SA_ICON_LIVING - -/mob/living/simple_mob/redpanda/fae - name = "dark wah" - desc = "Ominous, but still cute!" - tt_desc = "Ailurus brattus" - - icon_state = "wah_fae" - icon_living = "wah_fae" - icon_dead = "wah_fae_dead" - icon_rest = "wah_fae_rest" - - vore_ignores_undigestable = 0 // wah don't care you're edible or not, you still go in - vore_digest_chance = 0 // instead of digesting if you struggle... - vore_absorb_chance = 20 // you get to become adorable purple wahpudge. - vore_bump_chance = 75 - maxHealth = 100 - health = 100 - melee_damage_lower = 10 - melee_damage_upper = 20 diff --git a/code/modules/mob/living/simple_animal/vore/shadekin/_defines.dm b/code/modules/mob/living/simple_animal/vore/shadekin/_defines.dm deleted file mode 100644 index 1567134c4df..00000000000 --- a/code/modules/mob/living/simple_animal/vore/shadekin/_defines.dm +++ /dev/null @@ -1,13 +0,0 @@ -#define NOT_WHILE_SHIFTED 1 -#define ONLY_WHILE_SHIFTED 2 -#define SHIFTED_OR_NOT 3 - -#define BLUE_EYES 1 -#define RED_EYES 2 -#define PURPLE_EYES 3 -#define YELLOW_EYES 4 -#define GREEN_EYES 5 -#define ORANGE_EYES 6 - -#define AB_PHASE_SHIFTED 0x1 -#define AB_SHADE_REGEN 0x2 \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/vore/shadekin/ability_objects.dm b/code/modules/mob/living/simple_animal/vore/shadekin/ability_objects.dm deleted file mode 100644 index 6990623043b..00000000000 --- a/code/modules/mob/living/simple_animal/vore/shadekin/ability_objects.dm +++ /dev/null @@ -1,165 +0,0 @@ -/obj/effect/shadekin_ability - name = "" - desc = "" - icon = 'icons/mob/screen_spells.dmi' - var/ability_name = "FIX ME" - var/cost = 50 - var/mob/living/simple_mob/shadekin/my_kin - var/shift_mode = NOT_WHILE_SHIFTED - var/ab_sound - -/obj/effect/shadekin_ability/New(var/new_kin) - ..() - my_kin = new_kin - loc = null - -/obj/effect/shadekin_ability/Destroy() - my_kin = null - return ..() - -/obj/effect/shadekin_ability/proc/atom_button_text() - var/shift_denial - - if(shift_mode == NOT_WHILE_SHIFTED && (my_kin.ability_flags & AB_PHASE_SHIFTED)) - shift_denial = "Physical Only" - else if(shift_mode == ONLY_WHILE_SHIFTED && !(my_kin.ability_flags & AB_PHASE_SHIFTED)) - shift_denial = "Shifted Only" - - if(shift_denial) - name = shift_denial - else - name = my_kin.energy >= cost ? "Activate" : "No Energy" - return src - -/obj/effect/shadekin_ability/Click(var/location, var/control, var/params) - if(my_kin.stat) return - - var/list/clickprops = params2list(params) - var/opts = clickprops["shift"] - - if(opts) - to_chat(my_kin,"[name] (Cost: [cost]%) - [desc]") - else - do_ability(my_kin) - -/obj/effect/shadekin_ability/proc/do_ability() - if(my_kin.stat) - to_chat(my_kin,"Can't use that ability in your state!") - return FALSE - if(shift_mode == NOT_WHILE_SHIFTED && (my_kin.ability_flags & AB_PHASE_SHIFTED)) - to_chat(my_kin,"Can't use that ability while phase shifted!") - return FALSE - else if(shift_mode == ONLY_WHILE_SHIFTED && !(my_kin.ability_flags & AB_PHASE_SHIFTED)) - to_chat(my_kin,"Can only use that ability while phase shifted!") - return FALSE - else if(my_kin.energy < cost) - to_chat(my_kin,"Not enough energy for that ability!") - return FALSE - - my_kin.energy -= cost - if(ab_sound) - playsound(src,ab_sound,75,1) - - return TRUE - -///////////////////////////////////////////////////////////////// -/obj/effect/shadekin_ability/phase_shift - ability_name = "Phase Shift" - desc = "Shift yourself out of alignment with realspace to travel quickly between dark areas (or light areas, with a price)." - icon_state = "tech_passwall" - cost = 100 - shift_mode = SHIFTED_OR_NOT - ab_sound = 'sound/effects/stealthoff.ogg' -/obj/effect/shadekin_ability/phase_shift/do_ability() - if(!..()) - return - my_kin.phase_shift() - if(my_kin.ability_flags & AB_PHASE_SHIFTED) - cost = 0 //Shifting back is free (but harmful in light) - else - cost = initial(cost) -///////////////////////////////////////////////////////////////// -/obj/effect/shadekin_ability/heal_boop - ability_name = "Regenerate Other" - desc = "Spend energy to heal physical wounds in another creature." - icon_state = "tech_biomedaura" - cost = 50 - shift_mode = NOT_WHILE_SHIFTED - ab_sound = 'sound/effects/EMPulse.ogg' -/obj/effect/shadekin_ability/heal_boop/do_ability() - if(!..()) - return - if(!my_kin.mend_other()) - my_kin.energy += cost //Refund due to abort - -/datum/modifier/shadekin/heal_boop - name = "Shadekin Regen" - desc = "You feel serene and well rested." - mob_overlay_state = "green_sparkles" - - on_created_text = "Sparkles begin to appear around you, and all your ills seem to fade away." - on_expired_text = "The sparkles have faded, although you feel much healthier than before." - stacks = MODIFIER_STACK_EXTEND - -/datum/modifier/shadekin/heal_boop/tick() - if(!holder.getBruteLoss() && !holder.getFireLoss() && !holder.getToxLoss() && !holder.getOxyLoss() && !holder.getCloneLoss()) // No point existing if the spell can't heal. - expire() - return - holder.adjustBruteLoss(-2) - holder.adjustFireLoss(-2) - holder.adjustToxLoss(-2) - holder.adjustOxyLoss(-2) - holder.adjustCloneLoss(-2) -///////////////////////////////////////////////////////////////// -/obj/effect/shadekin_ability/create_shade - ability_name = "Create Shade" - desc = "Create a field of darkness that follows you." - icon_state = "tech_dispelold" - cost = 25 - shift_mode = NOT_WHILE_SHIFTED - ab_sound = 'sound/effects/bamf.ogg' -/obj/effect/shadekin_ability/create_shade/do_ability() - if(!..()) - return - my_kin.add_modifier(/datum/modifier/shadekin/create_shade,20 SECONDS) -/datum/modifier/shadekin/create_shade - name = "Shadekin Shadegen" - desc = "Darkness envelops you." - mob_overlay_state = "" - - on_created_text = "You drag part of The Dark into realspace, enveloping yourself." - on_expired_text = "You lose your grasp on The Dark and realspace reasserts itself." - stacks = MODIFIER_STACK_EXTEND - var/mob/living/simple_mob/shadekin/my_kin - -/datum/modifier/shadekin/create_shade/tick() - if(my_kin.ability_flags & AB_PHASE_SHIFTED) - expire() - -/datum/modifier/shadekin/create_shade/on_applied() - my_kin = holder - holder.glow_toggle = TRUE - holder.glow_range = 8 - holder.glow_intensity = -10 - holder.glow_color = "#FFFFFF" - holder.set_light(8, -10, "#FFFFFF") - -/datum/modifier/shadekin/create_shade/on_expire() - holder.glow_toggle = initial(holder.glow_toggle) - holder.glow_range = initial(holder.glow_range) - holder.glow_intensity = initial(holder.glow_intensity) - holder.glow_color = initial(holder.glow_color) - holder.set_light(0) - my_kin = null -/* -///////////////////////////////////////////////////////////////// -/obj/effect/shadekin_ability/energy_feast - ability_name = "Devour Energy" - desc = "Devour the energy from another creature (potentially fatal)." - icon_state = "gen_eat" - cost = 25 - shift_mode = NOT_WHILE_SHIFTED -/obj/effect/shadekin_ability/energy_feast/do_ability() - if(!..()) - return -*/ \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/vore/shadekin/ability_procs.dm b/code/modules/mob/living/simple_animal/vore/shadekin/ability_procs.dm deleted file mode 100644 index 0be707f852e..00000000000 --- a/code/modules/mob/living/simple_animal/vore/shadekin/ability_procs.dm +++ /dev/null @@ -1,133 +0,0 @@ -// Phase shifting procs (and related procs) -/mob/living/simple_mob/shadekin/proc/phase_shift() - var/turf/T = get_turf(src) - if(!T.CanPass(null,T) || loc != T) - to_chat(src,"You can't use that here!") - return FALSE - - forceMove(T) - var/original_canmove = canmove - SetStunned(0) - SetWeakened(0) - if(buckled) - buckled.unbuckle_mob() - if(pulledby) - pulledby.stop_pulling() - stop_pulling() - canmove = FALSE - - //Shifting in - if(ability_flags & AB_PHASE_SHIFTED) - ability_flags &= ~AB_PHASE_SHIFTED - name = real_name - for(var/belly in vore_organs) - var/obj/belly/B = belly - B.escapable = initial(B.escapable) - - overlays.Cut() - alpha = initial(alpha) - invisibility = initial(invisibility) - see_invisible = initial(see_invisible) - incorporeal_move = initial(incorporeal_move) - density = initial(density) - force_max_speed = initial(force_max_speed) - - //Cosmetics mostly - flick("tp_in",src) - custom_emote(1,"phases in!") - sleep(5) //The duration of the TP animation - canmove = original_canmove - - //Potential phase-in vore - if(can_be_drop_pred) //Toggleable in vore panel - var/list/potentials = living_mobs(0) - if(potentials.len) - var/mob/living/target = pick(potentials) - if(istype(target) && vore_selected) - target.forceMove(vore_selected) - to_chat(target,"\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!") - - // Do this after the potential vore, so we get the belly - update_icon() - - //Affect nearby lights - var/destroy_lights = 0 - if(eye_state == RED_EYES) - destroy_lights = 80 - if(eye_state == PURPLE_EYES) - destroy_lights = 25 - - for(var/obj/machinery/light/L in machines) - if(L.z != z || get_dist(src,L) > 10) - continue - - if(prob(destroy_lights)) - spawn(rand(5,25)) - L.broken() - else - L.flicker(10) - - //Shifting out - else - ability_flags |= AB_PHASE_SHIFTED - custom_emote(1,"phases out!") - real_name = name - name = "Something" - - for(var/belly in vore_organs) - var/obj/belly/B = belly - B.escapable = FALSE - - overlays.Cut() - flick("tp_out",src) - sleep(5) - invisibility = INVISIBILITY_LEVEL_TWO - see_invisible = INVISIBILITY_LEVEL_TWO - update_icon() - alpha = 127 - - canmove = original_canmove - incorporeal_move = TRUE - density = FALSE - force_max_speed = TRUE - -/mob/living/simple_mob/shadekin/UnarmedAttack() - if(ability_flags & AB_PHASE_SHIFTED) - return FALSE //Nope. - - . = ..() - -/mob/living/simple_mob/shadekin/can_fall() - if(ability_flags & AB_PHASE_SHIFTED) - return FALSE //Nope! - - return ..() - -/mob/living/simple_mob/shadekin/zMove(direction) - if(ability_flags & AB_PHASE_SHIFTED) - var/turf/destination = (direction == UP) ? GetAbove(src) : GetBelow(src) - if(destination) - forceMove(destination) - return TRUE - - return ..() - -// Healing others -/mob/living/simple_mob/shadekin/proc/mend_other() - //I hate to crunch a view() but I only want ones I can see - var/list/viewed = oview(1) - var/list/targets = list() - for(var/mob/living/L in viewed) - targets += L - if(!targets.len) - to_chat(src,"Nobody nearby to mend!") - return FALSE - - var/mob/living/target = input(src,"Pick someone to mend:","Mend Other") as null|anything in targets - if(!target) - return FALSE - - target.add_modifier(/datum/modifier/shadekin/heal_boop,1 MINUTE) - visible_message("\The [src] gently places a hand on \the [target]...") - face_atom(target) - return TRUE diff --git a/code/modules/mob/living/simple_animal/vore/shadekin/shadekin.dm b/code/modules/mob/living/simple_animal/vore/shadekin/shadekin.dm deleted file mode 100644 index a89688088dd..00000000000 --- a/code/modules/mob/living/simple_animal/vore/shadekin/shadekin.dm +++ /dev/null @@ -1,447 +0,0 @@ -/mob/living/simple_mob/shadekin //Spawning the prototype spawns a random one, see initialize() - name = "shadekin" - desc = "Some sort of fluffer. Big ears, long tail." - icon = 'icons/mob/vore_shadekin.dmi' - icon_state = "map_example" - icon_living = "map_example" - faction = "shadekin" - ui_icons = 'icons/mob/shadekin_hud.dmi' - intelligence_level = SA_HUMANOID - - maxHealth = 200 - health = 200 - - move_to_delay = 2 - speed = -1 - see_in_dark = 10 //SHADEkin - has_hands = TRUE //Pawbs - seedarkness = FALSE //SHAAAADEkin - attack_sound = 'sound/weapons/bladeslice.ogg' - has_langs = list(LANGUAGE_GALCOM,LANGUAGE_SHADEKIN) - - investigates = TRUE - reacts = TRUE - run_at_them = FALSE - cooperative = FALSE - - melee_damage_lower = 10 - melee_damage_upper = 20 - - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - minbodytemp = 0 - maxbodytemp = 900 - - speak_chance = 2 - speak = list("Marrr.", "Marrr?", "Marrr!") - emote_hear = list("chrrrrrs", "wurbles", "wrrrrbles") - emote_see = list("tailtwitches", "earflicks") - say_maybe_target = list("...mar?") - say_got_target = list("MAR!!!") - response_help = "pets the" - response_disarm = "bops the" - response_harm = "hits the" - attacktext = list("mauled","slashed","clawed") - friendly = list("boops", "pawbs", "mars softly at", "sniffs on") - reactions = list("Mar?" = "Marrr!", "Mar!" = "Marrr???", "Mar." = "Marrr.") - - vore_active = TRUE - vore_pounce_chance = 10 - vore_icons = SA_ICON_LIVING - swallowTime = 2 SECONDS - vore_escape_chance = 25 - - //None, they stay as their defaults. - vore_digest_chance = 0 - vore_absorb_chance = 0 - vore_bump_chance = 0 //They follow people, this would be DENGEROUS - - var/eye_state = RED_EYES //Eye color/energy gain/loss mode - var/eye_icon_state = null //Default, changed in init - var/eye_desc //Eye color description added to examine - - var/mob/living/carbon/human/henlo_human //Human we're stalking currently - - //Behavior - var/stalker = TRUE //Do we creep up on humans - var/shy_approach = FALSE //Do we creep up slowly on humans to boop them - - //Icon handling - var/image/tailimage //Cached tail image - - //Darknesssss - var/energy = 100 //For abilities - var/energy_adminbuse = FALSE //For adminbuse infinite energy - var/dark_gains = 0 //Last tick's change in energy - var/ability_flags = 0 //Flags for active abilities - var/obj/screen/darkhud //Holder to update this icon - var/obj/screen/energyhud //Holder to update this icon - - var/list/shadekin_abilities - -/mob/living/simple_mob/shadekin/Initialize() - //You spawned the prototype, and want a totally random one. - if(type == /mob/living/simple_mob/shadekin) - - //I'm told by VerySoft these are the liklihood values - var/list/sk_types = list( - /mob/living/simple_mob/shadekin/red = 20, //Actively seek people out to nom, so fairly common to see (relatively speaking), - /mob/living/simple_mob/shadekin/blue = 15, //Explorers that like to interact with people, so still fairly common, - /mob/living/simple_mob/shadekin/purple = 15, //Also explorers that may or may not homf people, - /mob/living/simple_mob/shadekin/yellow = 1 //Very rare, usually never leaves their home - ) - var/new_type = pickweight(sk_types) - - new new_type(loc) - initialized = TRUE - return INITIALIZE_HINT_QDEL - - if(icon_state == "map_example") - icon_state = pick("white","dark","brown") - - icon_living = icon_state - - switch(eye_state) - if(BLUE_EYES) - eye_icon_state = "e_blue" - if(RED_EYES) - eye_icon_state = "e_red" - if(PURPLE_EYES) - eye_icon_state = "e_purple" - if(YELLOW_EYES) - eye_icon_state = "e_yellow" - if(GREEN_EYES) - eye_icon_state = "e_green" - if(ORANGE_EYES) - eye_icon_state = "e_orange" - else - eye_icon_state = "e_red" - - tailimage = image('icons/mob/vore_shadekin64.dmi',null,icon_state) - tailimage.pixel_x = -16 - - if(eye_desc) - desc += " This one has [eye_desc]!" - - var/list/ability_types = subtypesof(/obj/effect/shadekin_ability) - shadekin_abilities = list() - for(var/type in ability_types) - shadekin_abilities += new type(src) - - update_icon() - - return ..() - -/mob/living/simple_mob/shadekin/Destroy() - QDEL_NULL_LIST(shadekin_abilities) - . = ..() - -/mob/living/simple_mob/shadekin/init_vore() - if(LAZYLEN(vore_organs)) - return - - var/obj/belly/B = new /obj/belly(src) - vore_selected = B - B.immutable = 1 - B.name = vore_stomach_name ? vore_stomach_name : "stomach" - B.desc = vore_stomach_flavor ? vore_stomach_flavor : "Your surroundings are warm, soft, and slimy. Makes sense, considering you're inside \the [name]." - B.digest_mode = vore_default_mode - B.escapable = vore_escape_chance > 0 - B.escapechance = vore_escape_chance - B.digestchance = vore_digest_chance - B.absorbchance = vore_absorb_chance - B.human_prey_swallow_time = swallowTime - B.nonhuman_prey_swallow_time = swallowTime - B.vore_verb = "swallow" - // TODO - Customizable per mob - B.emote_lists[DM_HOLD] = list( - "The walls gently squeeze against you. The wet sounds of shifting flesh against your form fill the air.", - "The hot, humid air rushes around you for a moment as the creature urps. The walls clench in around you for a moment, before relaxing again.", - "Your body is soaked in the fluids that cling to the churning walls. They squeeze across your form gently, conforming to your shape.", - "You can feel the world around you shift and sway as the creature moves! The flesh is stretchy, doughy. You can sink into it a little ways before it bounces back, curling you into a small shape." - ) - B.emote_lists[DM_DIGEST] = list( - "The walls slop thick slime across your body! It tingles briefly before the sting and ache sets in!", - "The sound of your body slipping and sliding against the powerfully churning stomach fills the air!", - "The grip of that stomach is harsh. Eagerly mushing and rubbing that slime into your body in attempts to break you down!", - "The intense churning and grinding jostles your around within the thick slime as you're slowly broken down!" - ) - B.emote_lists[DM_ABSORB] = list( - "The walls cling to you awfully close... It's almost like you're sinking into them.", - "You can feel the walls press in tightly against you, clinging to you posessively!", - "It almost feels like you're sinking into the soft, doughy flesh!", - "You can feel the walls press in around you. Almost molten, so squishy!!" - ) - B.emote_lists[DM_DRAIN] = list( - "The walls churn down on you heavily!! It's hard to move!", - "You can feel yourself getting weaker with every moment! The doughy walls sap your strength!", - "You're practically smothered in the oppressive heat of the creature's stomach!", - "It's hot, wet and tight!" - ) - B.emote_lists[DM_HEAL] = list( - "The walls pulse against you almost rhythmically. It feels nice, almost like a massage.", - "You're gently squeezed in pleasant warmth, softly churned.", - "The doughy feel of the heavy flesh clinging to you makes you feel a little stronger with every passing moment.", - "The flesh caresses across your body gently as you're held." - ) - B.digest_messages_prey = list( - "Your body is steadily softened more and more over time! Eventually you pass out. The creature's stomach rumbles powerfully as you are reduced to paste, processed for energy!", - "The creature's slimy gut lets out a heavy groan as you're slowly melted away. Gushing deeper through the creature.", - "The stinging and aching gives way to numbness as you're slowly smothered out. Your body is steadily reduced to nutrients and energy for the creature to continue on its way.", - "The chaos of being digested fades as you're snuffed out by a harsh clench! You're steadily broken down into a thick paste, processed and absorbed by the predator!" - ) - -/mob/living/simple_mob/shadekin/Life() - . = ..() - if(ability_flags & AB_PHASE_SHIFTED) - density = FALSE - - //Convert spare nutrition into energy at a certain ratio - if(. && nutrition > initial(nutrition) && energy < 100) - nutrition = max(0, nutrition-5) - energy = min(100,energy+1) - -/mob/living/simple_mob/shadekin/update_icon() - . = ..() - - cut_overlay(tailimage) - - tailimage.icon_state = icon_state - - add_overlay(tailimage) - add_overlay(eye_icon_state) - -/mob/living/simple_mob/shadekin/Stat() - . = ..() - if(statpanel("Shadekin")) - abilities_stat() - -/mob/living/simple_mob/shadekin/proc/abilities_stat() - for(var/A in shadekin_abilities) - var/obj/effect/shadekin_ability/ability = A - stat("[ability.ability_name]",ability.atom_button_text()) - -//They phase back to the dark when killed -/mob/living/simple_mob/shadekin/death(gibbed, deathmessage = "phases to somewhere far away!") - overlays = list() - icon_state = "" - flick("tp_out",src) - spawn(1 SECOND) - qdel(src) //Back from whence you came! - - . = ..(FALSE, deathmessage) - -//Blue-eyes want to nom people to heal them -/mob/living/simple_mob/shadekin/Found(var/atom/A) - if(specific_targets && isliving(A)) //Healing! - var/mob/living/L = A - var/health_percent = (L.health/L.maxHealth)*100 - if(health_percent <= 50 && will_eat(A)) - return A - . = ..() - -//They reach nutritional equilibrium (important for blue-eyes healbelly) -/mob/living/simple_mob/shadekin/Life() - if((. = ..())) - handle_shade() - -/mob/living/simple_mob/shadekin/proc/handle_shade() - //Shifted kin don't gain/lose energy (and save time if we're at the cap) - var/darkness = 1 - - - var/turf/T = get_turf(src) - if(!T) - dark_gains = 0 - return - - var/brightness = T.get_lumcount() //Brightness in 0.0 to 1.0 - darkness = 1-brightness //Invert - - if(ability_flags & AB_PHASE_SHIFTED) - dark_gains = 0 - else - //Heal (very) slowly in good darkness - if(darkness >= 0.75) - adjustFireLoss(-0.05) - adjustBruteLoss(-0.05) - adjustToxLoss(-0.05) - - switch(eye_state) - //Blue has constant, steady (slow) regen and ignores darkness. - if(BLUE_EYES) - dark_gains = 0.5 - //Red has extremely tiny energy buildup in dark, none in light, and hunts for energy. - if(RED_EYES) - if(darkness >= 0.75) - dark_gains = 0.25 - //Purple eyes have moderate gains in darkness and loss in light. - if(PURPLE_EYES) - dark_gains = round((darkness - 0.5) * 2, 0.1) - //Yellow has extreme gains in darkness and loss in light. - if(YELLOW_EYES) - dark_gains = round((darkness - 0.5) * 4, 0.1) - //Similar to blues, but passive is less, and affected by dark - if(GREEN_EYES) - dark_gains = 0.25 - dark_gains += round((darkness - 0.5), 0.1) - //More able to get energy out of the dark, worse attack gains tho - if(ORANGE_EYES) - if(darkness >= 0.65) - dark_gains = 0.30 - - energy = max(0,min(initial(energy),energy + dark_gains)) - - if(energy_adminbuse) - energy = 100 - - //Update turf darkness hud - if(darkhud) - switch(darkness) - if(0.80 to 1.00) - darkhud.icon_state = "dark2" - if(0.60 to 0.80) - darkhud.icon_state = "dark1" - if(0.40 to 0.60) - darkhud.icon_state = "dark" - if(0.20 to 0.40) - darkhud.icon_state = "dark-1" - if(0.00 to 0.20) - darkhud.icon_state = "dark-2" - - //Update energy storage hud - if(energyhud) - switch(energy) - if(80 to INFINITY) - energyhud.icon_state = "energy0" - if(60 to 80) - energyhud.icon_state = "energy1" - if(40 to 60) - energyhud.icon_state = "energy2" - if(20 to 40) - energyhud.icon_state = "energy3" - if(0 to 20) - energyhud.icon_state = "energy4" - -//Friendly ones wander towards people, maybe shy-ly if they are set to shy -/mob/living/simple_mob/shadekin/handle_wander_movement() - if(isturf(src.loc) && !resting && !buckled && canmove) - lifes_since_move++ - if(lifes_since_move >= turns_per_move) - if(!(stop_when_pulled && pulledby)) - var/moving_to - - if(stalker) - //Sniff sniff. - var/list/humans = human_mobs(world.view) - - //Can we see the last person we were following? - if(henlo_human && !(henlo_human in humans)) - henlo_human = null - - //Can we find a new person to follow? - if(!henlo_human) - while(!henlo_human && humans.len) - henlo_human = pick(humans) - if(!isturf(henlo_human.loc)) - humans -= henlo_human - henlo_human = null - - //Boopable hunam? - if(henlo_human) - moving_to = get_dir(src,henlo_human) - - if((get_dist(src,henlo_human) <= 1)) - dir = moving_to - if(prob(speak_chance)) - visible_message("\The [src] [pick(friendly)] \the [henlo_human].") - shy_approach = FALSE //ACCLIMATED - lifes_since_move = 0 - return //No need to move - - if(shy_approach) - var/them_to_us = turn(moving_to,180) - if(abs(dir2angle(henlo_human.dir) - dir2angle(them_to_us)) <= 90) - dir = them_to_us - return //AAA! - - dir = moving_to - - //Random walk - if(!moving_to) - moving_to = pick(cardinal) - dir = moving_to - - var/turf/T = get_step(src,moving_to) - if(avoid_turf(T)) - return - Move(T) - lifes_since_move = 0 - -/mob/living/simple_mob/shadekin/speech_bubble_appearance() - return "ghost" - -/mob/living/simple_mob/shadekin/DoPunch(var/atom/A) - . = ..(A) - if(isliving(A)) //We punched something! - var/mob/living/L = A - if(L.stat != DEAD) - var/gains = 0 - switch(eye_state) - if(RED_EYES) - gains = 8 - if(BLUE_EYES) - gains = 1 - if(PURPLE_EYES) - gains = 4 - if(YELLOW_EYES) - gains = 3 - if(GREEN_EYES) - gains = 1 - if(ORANGE_EYES) - gains = 5 - - energy += gains - -//Special hud elements for darkness and energy gains -/mob/living/simple_mob/shadekin/extra_huds(var/datum/hud/hud,var/icon/ui_style,var/list/hud_elements) - //Darkness hud - darkhud = new /obj/screen() - darkhud.icon = ui_style - darkhud.icon_state = "dark" - darkhud.name = "darkness" - darkhud.screen_loc = "CENTER-2:16,SOUTH:5" //Left of the left hand - darkhud.alpha = 150 - hud_elements |= darkhud - - //Energy hud - energyhud = new /obj/screen() - energyhud.icon = ui_style - energyhud.icon_state = "energy0" - energyhud.name = "energy" - energyhud.screen_loc = "CENTER+1:16,SOUTH:5" //Right of the right hand - energyhud.alpha = 150 - hud_elements |= energyhud - -// When someone clicks us with an empty hand -/mob/living/simple_mob/shadekin/attack_hand(mob/living/carbon/human/M as mob) - . = ..() - if(M.a_intent == I_HELP) - shy_approach = FALSE //ACCLIMATED - -/datum/language/shadekin - name = "Shadekin Empathy" - desc = "Shadekin seem to always know what the others are thinking. This is probably why." - colour = "changeling" - speech_verb = "mars" - ask_verb = "mars" - exclaim_verb = "mars" - key = "m" - machine_understands = 0 - flags = WHITELISTED | HIVEMIND diff --git a/code/modules/mob/living/simple_animal/vore/shadekin/types.dm b/code/modules/mob/living/simple_animal/vore/shadekin/types.dm deleted file mode 100644 index b236ec97536..00000000000 --- a/code/modules/mob/living/simple_animal/vore/shadekin/types.dm +++ /dev/null @@ -1,256 +0,0 @@ -///////////////////////////////////////////////////////////////// -/mob/living/simple_mob/shadekin/red - name = "red-eyed shadekin" - eye_state = RED_EYES - hostile = TRUE - retaliate = TRUE - stop_when_pulled = FALSE - destroy_surroundings = TRUE - armor = list( - "melee" = 30, - "bullet" = 20, - "laser" = 20, - "energy" = 50, - "bomb" = 10, - "bio" = 100, - "rad" = 100) - - eye_desc = "red eyes" - - vore_stomach_flavor = "You slip past pointy triangle teeth and down the slick, \ - slippery gullet of the creature. It's warm, and the air is thick. You can hear \ - its body squelch and shift around you as you settle into its stomach! Thick digestive \ - enzymes cling to you within that dark space, tingling and stinging immediately! The weight of \ - the doughy walls press in around you instantly, churning you up as you begin to digest!" - - player_msg = "You hunt for energy to fuel yourself, not minding in the least \ - if you strip it off unsuspecting prey. You're stronger than other shadekin, faster, and more capable in \ - a brawl, but you barely generate any of your own energy. You can stand in a dark spot to gather scraps \ - of energy in a pinch, but otherwise need to take it, by force if necessary." - -/mob/living/simple_mob/shadekin/red/white - icon_state = "white" -/mob/living/simple_mob/shadekin/red/dark - icon_state = "dark" -/mob/living/simple_mob/shadekin/red/brown - icon_state = "brown" - -///////////////////////////////////////////////////////////////// -/mob/living/simple_mob/shadekin/blue - name = "blue-eyed shadekin" - eye_state = BLUE_EYES - health = 100 - hostile = FALSE - retaliate = FALSE - stop_when_pulled = TRUE - specific_targets = TRUE //For finding injured people - destroy_surroundings = FALSE - vore_default_mode = DM_HEAL - vore_escape_chance = 75 - vore_standing_too = 1 - vore_pounce_chance = 100 - swallowTime = 4 SECONDS //A little longer to compensate for the above - vore_ignores_undigestable = FALSE - attacktext = list("shoved") - armor = list( - "melee" = 5, - "bullet" = 5, - "laser" = 5, - "energy" = 5, - "bomb" = 0, - "bio" = 100, - "rad" = 100) - - eye_desc = "blue eyes" - shy_approach = TRUE - stalker = TRUE - vore_stomach_flavor = "You slip past pointy triangle teeth and down the slick, \ - slippery gullet of the creature. It's warm, and the air is thick. You can hear its body \ - squelch and shift around you as you settle into its stomach! It's oddly calm, and very dark. \ - The doughy flesh rolls across your form in gentle waves. The aches and pains across your form slowly begin to \ - diminish, your body is healing much faster than normal! You're also soon soaked in harmless slime." - - player_msg = "You've chosen to generate your own energy rather than taking \ - it from others. Most of the time, anyway. You don't have a need to steal energy from others, and gather it up \ - without doing so, albeit slowly. Dark and light are irrelevant to you, they are just different places to explore and \ - discover new things and new people." - -/mob/living/simple_mob/shadekin/blue/white - icon_state = "white" -/mob/living/simple_mob/shadekin/blue/dark - icon_state = "dark" -/mob/living/simple_mob/shadekin/blue/brown - icon_state = "brown" - -///////////////////////////////////////////////////////////////// -/mob/living/simple_mob/shadekin/purple - name = "purple-eyed shadekin" - eye_state = PURPLE_EYES - health = 150 - hostile = FALSE - retaliate = TRUE - stop_when_pulled = FALSE - destroy_surroundings = TRUE - vore_default_mode = DM_HOLD - vore_digest_chance = 25 - vore_absorb_chance = 25 - armor = list( - "melee" = 15, - "bullet" = 15, - "laser" = 15, - "energy" = 15, - "bomb" = 15, - "bio" = 100, - "rad" = 100) - - eye_desc = "purple eyes" - shy_approach = TRUE - stalker = TRUE - vore_stomach_flavor = "You slip past pointy triangle teeth and down the slick, slippery gullet of the creature. \ - It's warm, and the air is thick. You can hear its body squelch and shift around you as you settle into its stomach! \ - It's relatively calm inside the dark organ. Wet and almost molten for how gooey your surroundings feel. \ - You can feel the doughy walls cling to you posessively... It's almost like you could sink into them. \ - There is also an ominous gurgling from somewhere nearby..." - - player_msg = "You're familiar with generating your own energy, but occasionally \ - steal it from others when it suits you. You generate energy at a moderate pace in dark areas, and staying in well-lit \ - areas is taxing on your energy. You can harvest energy from others in a fight, but since you don't need to, you may \ - just choose to simply not fight." - -/mob/living/simple_mob/shadekin/purple/white - icon_state = "white" -/mob/living/simple_mob/shadekin/purple/dark - icon_state = "dark" -/mob/living/simple_mob/shadekin/purple/brown - icon_state = "brown" - -///////////////////////////////////////////////////////////////// -/mob/living/simple_mob/shadekin/yellow - name = "yellow-eyed shadekin" - eye_state = YELLOW_EYES - health = 100 - hostile = FALSE - retaliate = TRUE - stop_when_pulled = FALSE - destroy_surroundings = TRUE - vore_default_mode = DM_DRAIN - vore_digest_chance = 5 - vore_ignores_undigestable = FALSE - armor = list( - "melee" = 5, - "bullet" = 5, - "laser" = 5, - "energy" = 5, - "bomb" = 0, - "bio" = 100, - "rad" = 100) - - eye_desc = "yellow eyes" - stalker = FALSE - vore_stomach_flavor = "You slip past pointy triangle teeth and down the slick, slippery gullet \ - of the creature. It's warm, and the air is thick. You can hear its body squelch and shift around you \ - as you settle into its stomach! The doughy walls within cling to you heavily, churning down on you, wearing \ - you out!! There doesn't appear to be any actual danger here, harmless slime clings to you, but it's getting \ - harder and harder to move as those walls press in on you insistently!" - - player_msg = "Your kind rarely ventures into realspace. Being in any well-lit \ - area is very taxing on you, but you gain energy extremely fast in any very dark area. You're weaker than other \ - shadekin, but your fast energy generation in the dark allows you to phase shift more often." - -/mob/living/simple_mob/shadekin/yellow/white - icon_state = "white" -/mob/living/simple_mob/shadekin/yellow/dark - icon_state = "dark" -/mob/living/simple_mob/shadekin/yellow/brown - icon_state = "brown" - -///////////////////////////////////////////////////////////////// -/mob/living/simple_mob/shadekin/green - name = "green-eyed shadekin" - eye_state = GREEN_EYES - health = 125 - hostile = FALSE - retaliate = TRUE - stop_when_pulled = FALSE - destroy_surroundings = TRUE - vore_default_mode = DM_DRAIN - vore_digest_chance = 0 - vore_ignores_undigestable = FALSE - armor = list( - "melee" = 5, - "bullet" = 5, - "laser" = 5, - "energy" = 5, - "bomb" = 0, - "bio" = 100, - "rad" = 100) - - eye_desc = "green eyes" - stalker = TRUE - vore_stomach_flavor = "You slip past pointy triangle teeth and down the slick, slippery gullet \ - of the creature. It's warm, and the air is thick. You can hear its body squelch and shift around you \ - as you settle into its stomach! The doughy walls within cling to you heavily, churning down on you, wearing \ - you out!! There doesn't appear to be any actual danger here, harmless slime clings to you, but it's getting \ - harder and harder to move as those walls press in on you insistently!" - - player_msg = "Your kind rarely ventures into realspace. Being in any well-lit area is very taxing on you, but you \ - have more experience than your yellow-eyed cousins. You gain energy decently fast in any very dark area. You're weaker than other \ - shadekin, but your slight energy generation constnatly, and especially in the dark allows for a good mix of uses." - -/mob/living/simple_mob/shadekin/green/white - icon_state = "white" -/mob/living/simple_mob/shadekin/green/dark - icon_state = "dark" -/mob/living/simple_mob/shadekin/green/brown - icon_state = "brown" - -///////////////////////////////////////////////////////////////// -/mob/living/simple_mob/shadekin/orange - name = "orange-eyed shadekin" - eye_state = ORANGE_EYES - health = 175 - hostile = TRUE - retaliate = TRUE - stop_when_pulled = FALSE - destroy_surroundings = TRUE - armor = list( - "melee" = 20, - "bullet" = 15, - "laser" = 15, - "energy" = 25, - "bomb" = 10, - "bio" = 100, - "rad" = 100) - - eye_desc = "orange eyes" - - vore_stomach_flavor = "You slip past pointy triangle teeth and down the slick, \ - slippery gullet of the creature. It's warm, and the air is thick. You can hear \ - its body squelch and shift around you as you settle into its stomach! Thick digestive \ - enzymes cling to you within that dark space, tingling and stinging immediately! The weight of \ - the doughy walls press in around you instantly, churning you up as you begin to digest!" - - player_msg = "You usually hunt for energy to fuel yourself, though not as often as your red-eyed cousins. \ - You're stronger than most shadekin, faster, and more capable in a brawl, but you don't generate much of your own energy. \ - You can stand in a dark spot to gather some energy, but otherwise need to take it, by force if necessary." - -/mob/living/simple_mob/shadekin/orange/white - icon_state = "white" -/mob/living/simple_mob/shadekin/orange/dark - icon_state = "dark" -/mob/living/simple_mob/shadekin/orange/brown - icon_state = "brown" - -///////////////////////////////////////////////////////////////// -//Fluffy specific fluffer -/mob/living/simple_mob/shadekin/blue/rivyr - name = "Rivyr" - desc = "She appears to be a fluffer of some sort. Deep blue eyes and curious attitude." - icon_state = "rivyr" - eye_desc = "" - vore_stomach_flavor = "Blue flesh gleams in the fading light as you slip down the little mar's gullet! \ - Gooey flesh and heat surrounds your form as you're tucked away into the darkness of her stomach! Thick slimes cling \ - to you, but they seem to be harmless. The organ gently churns around you, clinging to your shape and forcing \ - you to curl up a bit. You can feel her rub at you some through the layers of flesh and fluff, while aches \ - and pains begin to fade away across your body." - player_msg = "Mar? Mar mar. Mar mar mar. Mar. Mar mar? Mar! Mar. Marrrr." diff --git a/code/modules/mob/living/simple_animal/vore/shadekin/~defines.dm b/code/modules/mob/living/simple_animal/vore/shadekin/~defines.dm deleted file mode 100644 index 28ce75c50b1..00000000000 --- a/code/modules/mob/living/simple_animal/vore/shadekin/~defines.dm +++ /dev/null @@ -1,11 +0,0 @@ -#undef NOT_WHILE_SHIFTED -#undef ONLY_WHILE_SHIFTED -#undef SHIFTED_OR_NOT - -#undef BLUE_EYES -#undef RED_EYES -#undef PURPLE_EYES -#undef YELLOW_EYES - -#undef AB_PHASE_SHIFTED -#undef AB_SHADE_REGEN \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/vore/snake.dm b/code/modules/mob/living/simple_animal/vore/snake.dm deleted file mode 100644 index 9509f4b97e8..00000000000 --- a/code/modules/mob/living/simple_animal/vore/snake.dm +++ /dev/null @@ -1,28 +0,0 @@ -/mob/living/simple_mob/hostile/giant_snake - name = "giant snake" - desc = "Snakes. Why did it have to be snakes?" - icon = 'icons/mob/vore64x64.dmi' - icon_dead = "snake-dead" - icon_living = "snake" - icon_state = "snake" - - faction = "snake" - maxHealth = 200 - health = 200 - - melee_damage_lower = 10 - melee_damage_upper = 25 - - old_x = -16 - old_y = -16 - default_pixel_x = -16 - default_pixel_y = -16 - pixel_x = -16 - pixel_y = -16 - -// Activate Noms! -/mob/living/simple_mob/hostile/giant_snake - vore_active = 1 - vore_pounce_chance = 25 - vore_icons = SA_ICON_LIVING - swallowTime = 2 SECONDS // Hungry little bastards. diff --git a/code/modules/mob/living/simple_animal/vore/solargrub.dm b/code/modules/mob/living/simple_animal/vore/solargrub.dm deleted file mode 100644 index 94db615ec55..00000000000 --- a/code/modules/mob/living/simple_animal/vore/solargrub.dm +++ /dev/null @@ -1,119 +0,0 @@ -/* -A work in progress, lore will go here later. -List of things solar grubs should be able to do: - -2. have three stages of growth depending on time. (Or energy drained altho that seems like a hard one to code) -3. be capable of eating people that get knocked out. (also be able to shock attackers that don’t wear insulated gloves.) -5. ((potentially use digested people to reproduce)) -6. add glow? -*/ - -#define SINK_POWER 1 - -/mob/living/simple_mob/retaliate/solargrub - name = "juvenile solargrub" - desc = "A young sparkling solargrub" - icon = 'icons/mob/vore.dmi' //all of these are placeholders - icon_state = "solargrub" - icon_living = "solargrub" - icon_dead = "solargrub-dead" - - faction = "grubs" - maxHealth = 50 //grubs can take a lot of harm - health = 50 - move_to_delay = 5 - - melee_damage_lower = 1 - melee_damage_upper = 5 - - speak_chance = 1 - emote_see = list("squelches", "squishes") - - speed = 2 - - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/grubmeat - - response_help = "pokes" - response_disarm = "pushes" - response_harm = "roughly pushes" - - // solar grubs are not affected by atmos - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - - var/poison_per_bite = 5 //grubs cause a shock when they bite someone - var/poison_type = "shockchem" - var/poison_chance = 50 - var/datum/powernet/PN // Our powernet - var/obj/structure/cable/attached // the attached cable - var/emp_chance = 20 // Beware synths - -/mob/living/simple_mob/retaliate/solargrub/PunchTarget() - if(target_mob&& prob(emp_chance)) - target_mob.emp_act(4) //The weakest strength of EMP - visible_message("The grub releases a powerful shock!") - ..() - -/mob/living/simple_mob/retaliate/solargrub/Life() - . = ..() - if(!. || ai_inactive) return - - if(stance == STANCE_IDLE) - //first, check for potential cables nearby to powersink - var/turf/S = loc - attached = locate() in S - if(attached) - if(prob(2)) - src.visible_message("\The [src] begins to sink power from the net.") - if(prob(5)) - var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() - sparks.set_up(5, 0, get_turf(src)) - sparks.start() - anchored = 1 - PN = attached.powernet - PN.draw_power(100000) // previous value 150000 - var/apc_drain_rate = 750 //Going to see if grubs are better as a minimal bother. previous value : 4000 - for(var/obj/machinery/power/terminal/T in PN.nodes) - if(istype(T.master, /obj/machinery/power/apc)) - var/obj/machinery/power/apc/A = T.master - if(A.operating && A.cell) - var/cur_charge = A.cell.charge / CELLRATE - var/drain_val = min(apc_drain_rate, cur_charge) - A.cell.use(drain_val * CELLRATE) - else if(!attached && anchored) - anchored = 0 - PN = null - -/mob/living/simple_mob/retaliate/solargrub //active noms - vore_bump_chance = 50 - vore_bump_emote = "applies minimal effort to try and slurp up" - vore_active = 1 - vore_capacity = 1 - vore_pounce_chance = 0 //grubs only eat incapacitated targets - vore_default_mode = DM_DIGEST - -/mob/living/simple_mob/retaliate/solargrub/PunchTarget() - . = ..() - if(isliving(.)) - var/mob/living/L = . - if(L.reagents) - if(prob(poison_chance)) - L << "You feel a shock rushing through your veins." - L.reagents.add_reagent(poison_type, poison_per_bite) - -/mob/living/simple_mob/retaliate/solargrub/death() - src.anchored = 0 - set_light(0) - ..() - -/mob/living/simple_mob/retaliate/solargrub/handle_light() - . = ..() - if(. == 0 && !is_dead()) - set_light(2.5, 1, COLOR_YELLOW) - return 1 diff --git a/code/modules/mob/living/simple_animal/vore/solargrub_larva.dm b/code/modules/mob/living/simple_animal/vore/solargrub_larva.dm deleted file mode 100644 index 0fd32be6ee6..00000000000 --- a/code/modules/mob/living/simple_animal/vore/solargrub_larva.dm +++ /dev/null @@ -1,256 +0,0 @@ -var/global/list/grub_machine_overlays = list() - -/mob/living/simple_mob/solargrub_larva - name = "solargrub larva" - desc = "A tiny wormy thing that can grow to massive sizes under the right conditions." - icon = 'icons/mob/vore.dmi' - icon_state = "grublarva" - icon_living = "grublarva" - icon_dead = "grublarva-dead" - - health = 5 - maxHealth = 5 - - meat_amount = 2 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/grubmeat - - faction = "grubs" - - response_help = "pats" - response_disarm = "nudges" - response_harm = "stomps on" - - mob_size = MOB_MINISCULE - pass_flags = PASSTABLE - can_pull_size = ITEMSIZE_TINY - can_pull_mobs = MOB_PULL_NONE - density = 0 - - stop_when_pulled = 0 - - var/static/list/ignored_machine_types = list( - /obj/machinery/atmospherics/unary/vent_pump, - /obj/machinery/atmospherics/unary/vent_scrubber, - /obj/machinery/door/firedoor - ) - - var/obj/machinery/atmospherics/unary/vent_pump/target_vent - - var/datum/effect/effect/system/spark_spread/sparks - var/image/machine_effect - - var/obj/machinery/abstract_grub_machine/powermachine - var/power_drained = 0 - var/forced_out = 0 - -/mob/living/simple_mob/solargrub_larva/New() - ..() - powermachine = new(src) - sparks = new(src) - sparks.set_up() - sparks.attach(src) - verbs += /mob/living/proc/ventcrawl - -/mob/living/simple_mob/solargrub_larva/death() - powermachine.draining = 0 - set_light(0) - return ..() - -/mob/living/simple_mob/solargrub_larva/Destroy() - QDEL_NULL(powermachine) - QDEL_NULL(sparks) - QDEL_NULL(machine_effect) - target_vent = null - return ..() - -/mob/living/simple_mob/solargrub_larva/Life() - . = ..() - - if(machine_effect && !istype(loc, /obj/machinery)) - QDEL_NULL(machine_effect) - - if(!. || ai_inactive) - return - - if(power_drained >= 7 MEGAWATTS && prob(5)) - expand_grub() - return - - if(istype(loc, /obj/machinery)) - if(machine_effect && air_master.current_cycle%30) - for(var/mob/M in player_list) - M << machine_effect - if(prob(10)) - sparks.start() - return - - if(stance == STANCE_IDLE) - if(forced_out) - forced_out = Clamp(0, forced_out--, forced_out) - return - - if(target_vent) - if(Adjacent(target_vent)) - spawn() - do_ventcrawl(target_vent) - target_vent = null - else - target_vent = null - stop_automated_movement = 0 - walk(src, 0) - return - - if(prob(20)) - var/list/possible_machines = list() - for(var/obj/machinery/M in orange(1,src)) - if(!Adjacent(M)) - continue - if(istype(M, /obj/machinery/power/apc) || istype(M, /obj/machinery/power/smes)) //APCs and SMES units don't actually use power, but it's too thematic to ignore them - possible_machines += M - continue - if(is_type_in_list(M, ignored_machine_types)) - continue - if(!M.idle_power_usage && !M.active_power_usage) //If it can't use power at all, ignore it - continue - possible_machines += M - if(possible_machines.len) - enter_machine(pick(possible_machines)) - return - - if(prob(10)) - var/list/vents = list() - for(var/obj/machinery/atmospherics/unary/vent_pump/vent in view(7,src)) - if(vent.welded) - continue - vents += vent - if(vents.len) - var/picked = pick(vents) - target_vent = picked - WanderTowards(get_turf(picked)) - return - -/mob/living/simple_mob/solargrub_larva/proc/enter_machine(var/obj/machinery/M) - if(!istype(M)) - return - forceMove(M) - powermachine.draining = 2 - visible_message("\The [src] finds an opening and crawls inside \the [M].") - if(!(M.type in grub_machine_overlays)) - generate_machine_effect(M) - machine_effect = image(grub_machine_overlays[M.type], M) //Can't do this the reasonable way with an overlay, - for(var/mob/L in player_list) //because nearly every machine updates its icon by removing all overlays first - L << machine_effect - -/mob/living/simple_mob/solargrub_larva/proc/generate_machine_effect(var/obj/machinery/M) - var/icon/I = new /icon(M.icon, M.icon_state) - I.Blend(new /icon('icons/effects/blood.dmi', rgb(255,255,255)),ICON_ADD) - I.Blend(new /icon('icons/effects/alert.dmi', "_red"),ICON_MULTIPLY) - grub_machine_overlays[M.type] = I - -/mob/living/simple_mob/solargrub_larva/proc/eject_from_machine(var/obj/machinery/M) - if(!M) - if(istype(loc, /obj/machinery)) - M = loc - else - return - forceMove(get_turf(M)) - sparks.start() - if(machine_effect) - QDEL_NULL(machine_effect) - forced_out += rand(5,15) - powermachine.draining = 1 - -/mob/living/simple_mob/solargrub_larva/proc/do_ventcrawl(var/obj/machinery/atmospherics/unary/vent_pump/vent) - if(!vent) - return - var/obj/machinery/atmospherics/unary/vent_pump/end_vent = get_safe_ventcrawl_target(vent) - if(!end_vent) - return - forceMove(vent) - playsound(vent, 'sound/machines/ventcrawl.ogg', 50, 1, -3) - vent.visible_message("\The [src] wiggles into \the [vent]!") - var/redirect_attempts = 3 - while(redirect_attempts) - var/travel_time = round(get_dist(get_turf(src), get_turf(end_vent)) / 2) - sleep(travel_time) - if(end_vent.welded) - end_vent = get_safe_ventcrawl_target(vent) - if(!end_vent) - forceMove(get_turf(vent)) - return - redirect_attempts-- - continue - break - playsound(end_vent, 'sound/machines/ventcrawl.ogg', 50, 1, -3) - forceMove(get_turf(end_vent)) - -/mob/living/simple_mob/solargrub_larva/proc/expand_grub() - eject_from_machine() - visible_message("\The [src] suddenly balloons in size!") - new /mob/living/simple_mob/retaliate/solargrub(get_turf(src)) -// var/mob/living/simple_mob/retaliate/solargrub/grub = new(get_turf(src)) -// grub.power_drained = power_drained //TODO - qdel(src) - -/mob/living/simple_mob/solargrub_larva/handle_light() - . = ..() - if(. == 0 && !is_dead()) - set_light(1.5, 1, COLOR_YELLOW) - return 1 - - -/obj/machinery/abstract_grub_machine - var/total_active_power_usage = 45 KILOWATTS - var/list/active_power_usages = list(15 KILOWATTS, 15 KILOWATTS, 15 KILOWATTS) - var/total_idle_power_usage = 3 KILOWATTS - var/list/idle_power_usages = list(1 KILOWATTS, 1 KILOWATTS, 1 KILOWATTS) - var/draining = 1 - var/mob/living/simple_mob/solargrub_larva/grub - -/obj/machinery/abstract_grub_machine/New() - ..() - shuffle_power_usages() - grub = loc - if(!istype(grub)) - grub = null - qdel(src) - -/obj/machinery/abstract_grub_machine/Destroy() - grub = null - return ..() - -/obj/machinery/abstract_grub_machine/process() - if(!draining) - return - var/area/A = get_area(src) - if(!A) - return - var/list/power_list - switch(draining) - if(1) - power_list = idle_power_usages - if(2) - power_list = active_power_usages - for(var/i = 1 to power_list.len) - if(A.powered(i)) - use_power(power_list[i], i) - grub.power_drained += power_list[i] - if(prob(5)) - shuffle_power_usages() - -/obj/machinery/abstract_grub_machine/proc/shuffle_power_usages() - total_active_power_usage = rand(30 KILOWATTS, 60 KILOWATTS) - total_idle_power_usage = rand(1 KILOWATTS, 5 KILOWATTS) - active_power_usages = split_into_3(total_active_power_usage) - idle_power_usages = split_into_3(total_idle_power_usage) - - -/obj/item/device/multitool/afterattack(obj/O, mob/user, proximity) - if(proximity) - if(istype(O, /obj/machinery)) - var/mob/living/simple_mob/solargrub_larva/grub = locate() in O - if(grub) - grub.eject_from_machine(O) - to_chat(user, "You disturb a grub nesting in \the [O]!") - return - return ..() diff --git a/code/modules/mob/living/simple_animal/vore/wolf.dm b/code/modules/mob/living/simple_animal/vore/wolf.dm deleted file mode 100644 index ac286b2f1d4..00000000000 --- a/code/modules/mob/living/simple_animal/vore/wolf.dm +++ /dev/null @@ -1,27 +0,0 @@ -/mob/living/simple_mob/hostile/wolf - name = "grey wolf" - desc = "My, what big jaws it has!" - tt_desc = "Canis lupus" - icon = 'icons/mob/vore.dmi' - icon_dead = "wolf-dead" - icon_living = "wolf" - icon_state = "wolf" - - speed = 5 - - run_at_them = 0 - cooperative = 1 - investigates = 1 - returns_home = 1 - reacts = 1 - - harm_intent_damage = 5 - melee_damage_lower = 10 - melee_damage_upper = 25 - - minbodytemp = 200 - -// Activate Noms! -/mob/living/simple_mob/hostile/wolf - vore_active = 1 - vore_icons = SA_ICON_LIVING diff --git a/code/modules/mob/living/simple_animal/vore/wolfgirl.dm b/code/modules/mob/living/simple_animal/vore/wolfgirl.dm deleted file mode 100644 index 152ba5b1c83..00000000000 --- a/code/modules/mob/living/simple_animal/vore/wolfgirl.dm +++ /dev/null @@ -1,62 +0,0 @@ -/mob/living/simple_mob/retaliate/wolfgirl - name = "wolfgirl" - desc = "AwooOOOOoooo!" - tt_desc = "Homo lupus" - icon = 'icons/mob/vore.dmi' - icon_state = "wolfgirl" - icon_living = "wolfgirl" - icon_dead = "wolfgirl-dead" - intelligence_level = SA_HUMANOID - - faction = "wolfgirl" - maxHealth = 30 - health = 30 - - run_at_them = 0 - cooperative = 1 - investigates = 1 - firing_lines = 1 - returns_home = 1 - reacts = 1 - - response_help = "pats the" - response_disarm = "gently pushes aside the" - response_harm = "hits the" - - harm_intent_damage = 8 - melee_damage_lower = 15 - melee_damage_upper = 15 - attacktext = list("slashed") - - speak_chance = 1 - speak = list("AwoooOOOOoooo!", - "Awoo~", - "I'll protect the forest! ... Where's the forest again?", - "All I need is my sword!", - "Awoo?", - "Anyone else smell that?") - emote_hear = list("awoooos!","hmms to herself","plays with her sword") - emote_see = list("narrows her eyes","sniffs the air") - say_understood = list() - say_cannot = list() - say_maybe_target = list("An enemy!?","What was that?","Is that...?","Hmm?") - say_got_target = list("You won't get away!","I've had it!","I'll vanquish you!","AWOOOOO!") - reactions = list("Are you a dog?" = "Who, me?! No! Stop saying that!", - "Awoo!" = "AwooooOOOOooo!", - "Awoo?" = "Awoo.", - "Awoo." = "Awoo?",) - - var/loopstop = 0 //To prevent circular awoooos. - -/mob/living/simple_mob/retaliate/wolfgirl/hear_say() - if(world.time - loopstop < 5 SECONDS) - return - else - loopstop = world.time - ..() - -// Activate Noms! -/mob/living/simple_mob/retaliate/wolfgirl - vore_active = 1 - vore_pounce_chance = 40 - vore_icons = SA_ICON_LIVING diff --git a/code/modules/mob/living/simple_animal/vore/zz_vore_overrides.dm b/code/modules/mob/living/simple_animal/vore/zz_vore_overrides.dm deleted file mode 100644 index 432d48c3abb..00000000000 --- a/code/modules/mob/living/simple_animal/vore/zz_vore_overrides.dm +++ /dev/null @@ -1,250 +0,0 @@ -// -// This file overrides settings on upstream simple animals to turn on vore behavior -// - -/* -## For anything that previously inhertited from: /mob/living/simple_mob/hostile/vore ## - - vore_active = 1 - icon = 'icons/mob/vore.dmi' - -## For anything that previously inhertied from: /mob/living/simple_mob/hostile/vore/large ## - - vore_active = 1 - icon = 'icons/mob/vore64x64.dmi' - old_x = -16 - old_y = -16 - pixel_x = -16 - pixel_y = -16 - vore_pounce_chance = 50 -*/ - -// -// Okay! Here we go! -// - -/mob/living/simple_mob/animal/space/alien - vore_active = 1 - icon = 'icons/mob/vore.dmi' - icon_state = "xenohunter" - icon_living = "xenohunter" - icon_dead = "xenohunter-dead" - icon_gib = "gibbed-a" - vore_icons = SA_ICON_LIVING - -/mob/living/simple_mob/animal/space/alien/drone - vore_active = 1 - icon = 'icons/mob/vore.dmi' - icon_state = "xenodrone" - icon_living = "xenodrone" - icon_dead = "xenodrone-dead" - icon_gib = "gibbed-a" - vore_icons = SA_ICON_LIVING - -/mob/living/simple_mob/animal/space/alien/sentinel - vore_active = 1 - icon = 'icons/mob/vore.dmi' - icon_state = "xenosentinel" - icon_living = "xenosentinel" - icon_dead = "xenosentinel-dead" - icon_gib = "gibbed-a" - vore_icons = SA_ICON_LIVING - -/mob/living/simple_mob/animal/space/alien/queen - vore_active = 1 - icon = 'icons/mob/vore.dmi' - icon_state = "xenoqueen" - icon_living = "xenoqueen" - icon_dead = "xenoqueen-dead" - icon_gib = "gibbed-a" - vore_icons = SA_ICON_LIVING - -/mob/living/simple_mob/animal/space/alien/queen/empress - vore_active = 1 - icon = 'icons/mob/vore64x64.dmi' - icon_state = "queen_s" - icon_living = "queen_s" - icon_dead = "queen_dead" - vore_icons = SA_ICON_LIVING | SA_ICON_REST - old_x = -16 - old_y = 0 - default_pixel_x = -16 - pixel_x = -16 - pixel_y = 0 - - vore_capacity = 3 - vore_pounce_chance = 75 - -/mob/living/simple_mob/animal/space/alien/sentinel/praetorian - icon = 'icons/mob/vore64x64.dmi' - vore_icons = SA_ICON_LIVING | SA_ICON_REST - -/mob/living/simple_mob/animal/space/alien/queen/empress/mother - vore_icons = 0 // NO VORE SPRITES - -/mob/living/simple_mob/animal/space/bear - vore_active = 1 - icon = 'icons/mob/vore.dmi' - icon_state = "spacebear" - icon_living = "spacebear" - icon_dead = "spacebear-dead" - icon_gib = "bear-gib" - vore_icons = SA_ICON_LIVING - -/mob/living/simple_mob/animal/space/bear/hudson - name = "Hudson" - -/mob/living/simple_mob/animal/space/bear/brown - vore_active = 1 - icon = 'icons/mob/vore.dmi' - name = "brown bear" - icon_state = "brownbear" - icon_living = "brownbear" - icon_dead = "brownbear-dead" - icon_gib = "bear-gib" - vore_icons = SA_ICON_LIVING - -/mob/living/simple_mob/animal/space/carp - icon = 'icons/mob/vore.dmi' - vore_active = 1 - vore_icons = SA_ICON_LIVING - -/mob/living/simple_mob/hostile/creature/vore - vore_active = 1 - // NO VORE SPRITES - vore_capacity = 0 - vore_pounce_chance = 0 // Only pounces if you're crit. - vore_escape_chance = 0 // As such, if you're a dibshit who feeds yourself to it, you're staying down. - // Overrides to non-vore version - speed = 4 // Slow it down a bit - health = 80 // Increase health to compensate - maxHealth = 80 - -/mob/living/simple_mob/hostile/mimic - vore_active = 1 - // NO VORE SPRITES - vore_capacity = 0 - vore_pounce_chance = 33 - // Overrides to non-vore version - maxHealth = 60 - health = 60 - -/mob/living/simple_mob/animal/passive/cat - vore_active = 1 - // NO VORE SPRITES - specific_targets = 0 // Targeting UNLOCKED - vore_max_size = RESIZE_TINY - -/mob/living/simple_mob/animal/passive/cat/PunchTarget() - if(istype(target_mob,/mob/living/simple_mob/animal/passive/mouse)) - visible_message("\The [src] pounces on \the [target_mob]!]") - target_mob.Stun(5) - return EatTarget() - else ..() - -/mob/living/simple_mob/animal/passive/cat/Found(var/atom/found_atom) - if(!SA_attackable(found_atom)) - return null - if(istype(found_atom,/mob/living/simple_mob/animal/passive/mouse)) - return found_atom - if(found_atom in friends) - return null - if(will_eat(found_atom)) - return found_atom - -/mob/living/simple_mob/animal/passive/cat/fluff/Found(var/atom/found_atom) - if (friend == found_atom) - return null - return ..() - -/mob/living/simple_mob/animal/passive/cat/fluff - vore_ignores_undigestable = 0 - vore_pounce_chance = 100 - vore_digest_chance = 0 // just use the toggle - vore_default_mode = DM_HOLD //can use the toggle if you wanna be catfood - vore_standing_too = TRUE //gonna get pounced - -/mob/living/simple_mob/animal/passive/cat/fluff/EatTarget() - var/mob/living/TM = target_mob - prey_excludes += TM //so they won't immediately re-eat someone who struggles out (or gets newspapered out) as soon as they're ate - spawn(3600) // but if they hang around and get comfortable, they might get ate again - if(src && TM) - prey_excludes -= TM - ..() // will_eat check is carried out before EatTarget is called, so prey on the prey_excludes list isn't a problem. - -/mob/living/simple_mob/fox - vore_active = 1 - // NO VORE SPRITES - vore_max_size = RESIZE_TINY - -/mob/living/simple_mob/fox/PunchTarget() - if(istype(target_mob,/mob/living/simple_mob/animal/passive/mouse)) - return EatTarget() - else ..() - -/mob/living/simple_mob/fox/Found(var/atom/found_atom) - if(!SA_attackable(found_atom)) - return null - if(istype(found_atom,/mob/living/simple_mob/animal/passive/mouse)) - return found_atom - if(found_atom in friends) - return null - if(will_eat(found_atom)) - return found_atom - -/mob/living/simple_mob/fox/fluff/Found(var/atom/found_atom) - if (friend == found_atom) - return null - return ..() - -/mob/living/simple_mob/fox/fluff - vore_ignores_undigestable = 0 - vore_pounce_chance = 100 - vore_digest_chance = 0 // just use the toggle - vore_default_mode = DM_HOLD //can use the toggle if you wanna be foxfood - vore_standing_too = TRUE // gonna get pounced - -/mob/living/simple_mob/fox/fluff/EatTarget() - var/mob/living/TM = target_mob - prey_excludes += TM //so they won't immediately re-eat someone who struggles out (or gets newspapered out) as soon as they're ate - spawn(3600) // but if they hang around and get comfortable, they might get ate again - if(src && TM) - prey_excludes -= TM - ..() // will_eat check is carried out before EatTarget is called, so prey on the prey_excludes list isn't a problem. - -/mob/living/simple_mob/animal/space/goose - vore_active = 1 - // NO VORE SPRITES - vore_max_size = RESIZE_SMALL - -/mob/living/simple_mob/animal/passive/penguin - vore_active = 1 - // NO VORE SPRITES - vore_max_size = RESIZE_SMALL - - -/mob/living/simple_mob/animal/space/carp/pike - vore_active = 1 - // NO VORE SPRITES - -/mob/living/simple_mob/animal/space/carp/holodeck - vore_icons = 0 // NO VORE SPRITES - vore_digest_chance = 0 - vore_absorb_chance = 0 - -// Override stuff for holodeck carp to make them not digest when set to safe! -/mob/living/simple_mob/animal/space/carp/holodeck/init_vore() - . = ..() - var/safe = (faction == "neutral") - for(var/belly in vore_organs) - var/obj/belly/B = belly - B.digest_mode = safe ? DM_HOLD : vore_default_mode - -/mob/living/simple_mob/animal/space/carp/holodeck/set_safety(var/safe) - . = ..() - for(var/belly in vore_organs) - var/obj/belly/B = belly - B.digest_mode = safe ? DM_HOLD : vore_default_mode - -/mob/living/simple_mob/animal/passive/mouse - faction = "mouse" //Giving mice a faction so certain mobs can get along with them. \ No newline at end of file diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/adv_dark_gygax.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/adv_dark_gygax.dm index 39708365dfd..8b3b6fff5d5 100644 --- a/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/adv_dark_gygax.dm +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/mecha/adv_dark_gygax.dm @@ -81,7 +81,7 @@ icon_scale_y = 1.5 movement_shake_radius = 14 - maxHealth = 450 + maxHealth = 350 //VOREStation Edit deflect_chance = 25 has_repair_droid = TRUE armor = list( @@ -134,7 +134,7 @@ ..() set_pixel_speed(0.5) -#define ELECTRIC_ZAP_POWER 20000 +#define ELECTRIC_ZAP_POWER 15000 //VOREStation Edit // Charges a tesla shot, while emitting a dangerous electric field. The exosuit is immune to electric damage while this is ongoing. // It also briefly blinds anyone looking directly at the mech without flash protection. diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm index 2952ac26d4c..3714bc8da23 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -730,6 +730,7 @@ if(issmall(M)) effective_dose *= 2 +/* //VOREStation Removal - Assuming all juice has sugar is silly if(alien == IS_UNATHI) if(effective_dose < 2) if(effective_dose == metabolism * 2 || prob(5)) @@ -743,6 +744,7 @@ else M.sleeping = max(M.sleeping, 20) M.drowsyness = max(M.drowsyness, 60) +*/ /datum/reagent/drink/juice/lemon name = "Lemon Juice" diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm index 7bdeb648b61..c073cd6d50e 100644 --- a/code/modules/vore/eating/bellymodes_vr.dm +++ b/code/modules/vore/eating/bellymodes_vr.dm @@ -114,7 +114,7 @@ for(var/slot in slots) var/obj/item/I = H.get_equipped_item(slot = slot) if(I) - H.unEquip(I,force = TRUE) + H.unEquip(I,force = FALSE) if(contaminates || istype(I,/obj/item/weapon/card/id)) I.gurgle_contaminate(contents, contamination_flavor, contamination_color) if(item_digest_mode == IM_HOLD) diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm index 76175865978..4f3462fdbf6 100644 --- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm @@ -845,7 +845,6 @@ armor = list(melee = 50, bullet = 40, laser = 45, energy = 25, bomb = 50, bio = 100, rad = 50) //These values were taken from the combat rigs and adjusted to be weaker than said rigs. slowdown = 0 allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/melee/baton) - w_class = ITEMSIZE_NORMAL icon = 'icons/vore/custom_clothes_vr.dmi' icon_state = "joansuit" diff --git a/maps/tether/tether-06-station2.dmm b/maps/tether/tether-06-station2.dmm index e052f8ae0f2..ddc948de6ee 100644 --- a/maps/tether/tether-06-station2.dmm +++ b/maps/tether/tether-06-station2.dmm @@ -7211,6 +7211,7 @@ /obj/item/clothing/mask/breath, /obj/item/clothing/head/helmet/space/void/exploration, /obj/machinery/atmospherics/unary/vent_pump/on, +/obj/item/weapon/tank/jetpack/carbondioxide, /turf/simulated/floor/tiled, /area/tether/exploration/equipment) "kE" = ( @@ -7241,6 +7242,7 @@ pixel_x = 0; pixel_y = 26 }, +/obj/item/weapon/tank/jetpack/carbondioxide, /turf/simulated/floor/tiled, /area/tether/exploration/equipment) "kF" = ( @@ -7398,6 +7400,7 @@ pixel_x = 0; pixel_y = 26 }, +/obj/item/weapon/tank/jetpack/carbondioxide, /turf/simulated/floor/tiled, /area/tether/exploration/equipment) "kS" = ( @@ -8574,6 +8577,7 @@ /obj/item/clothing/suit/space/void/exploration, /obj/item/clothing/mask/breath, /obj/item/clothing/head/helmet/space/void/exploration, +/obj/item/weapon/tank/jetpack/carbondioxide, /turf/simulated/floor/tiled, /area/tether/exploration/pathfinder_office) "mA" = ( diff --git a/maps/tether/tether-10-colony.dmm b/maps/tether/tether-10-colony.dmm index 44d57d6908e..76f15beb398 100644 --- a/maps/tether/tether-10-colony.dmm +++ b/maps/tether/tether-10-colony.dmm @@ -25795,6 +25795,8 @@ }, /obj/item/slime_extract/pink, /obj/item/slime_extract/pink, +/obj/item/weapon/deadringer, +/obj/item/weapon/deadringer, /turf/simulated/floor/tiled/techmaint, /area/mothership/vault) "XY" = (