Merge pull request #6349 from Novacat/nova-basicfixes

Misc Changes and bugfixes
This commit is contained in:
Novacat
2019-12-31 18:39:10 -05:00
committed by GitHub
87 changed files with 87 additions and 11424 deletions
-1
View File
@@ -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,
+6 -4
View File
@@ -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))
+40 -16
View File
@@ -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 += " <i>(as [C.holder.fakekey])</i>"
//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 += " <i>(as [C.holder.fakekey])</i>"
//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 += " <i>(as [C.holder.fakekey])</i>"
//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, "<span class='info'>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.</span>")
msg = "<b>Current Admins ([num_admins_online]):</b>\n" + msg
if(config.show_mods)
msg += "\n<b> Current Moderators ([num_mods_online]):</b>\n" + modmsg
msg += "\n<b> Current Game Masters ([num_mods_online]):</b>\n" + modmsg //VOREStation Edit
if(config.show_devs)
msg += "\n<b> Current Developers ([num_devs_online]):</b>\n" + devmsg
if(config.show_event_managers)
msg += "\n<b> Current Event Managers ([num_event_managers_online]):</b>\n" + eventMmsg
msg += "\n<b> Current Miscellaneous ([num_event_managers_online]):</b>\n" + eventMmsg //VOREStation Edit
src << msg
+4 -4
View File
@@ -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
+5 -44
View File
@@ -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)
+6 -6
View File
@@ -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 = "<span class='notice'><b>ADMINHELP</b>: <b>[key_name(usr.client)]</b> is attending to <b>[key_name(M)]'s</b> adminhelp, please don't dogpile them.</span>"
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, "<span class='notice'><b>Your adminhelp is being attended to by [usr.client]. Thanks for your patience!</b></span>")
// VoreStation Edit Start
@@ -1284,7 +1284,7 @@
to_chat(usr, "<span class='warning'>Unable to locate mob.</span>")
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!"
+8 -7
View File
@@ -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 << "<span class='admin_channel'>" + create_text_tag("admin", "ADMIN:", C) + " <span class='name'>[key_name(usr, 1)]</span>([admin_jump_link(mob, src)]): <span class='message'>[msg]</span></span>"
//VOREStation Edit Start - Adds R_EVENT
for(var/client/C in admins)
if(check_rights(R_ADMIN|R_EVENT))
C << "<span class='admin_channel'>" + create_text_tag("admin", "ADMIN:", C) + " <span class='name'>[key_name(usr, 1)]</span>([admin_jump_link(mob, src)]): <span class='message'>[msg]</span></span>"
//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 = "<span class='admin'>[sender_name]</span>"
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 << "<span class='mod_channel'>" + create_text_tag("mod", "MOD:", C) + " <span class='name'>[sender_name]</span>([admin_jump_link(mob, C.holder)]): <span class='message'>[msg]</span></span>"
feedback_add_details("admin_verb","MS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+7 -7
View File
@@ -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
@@ -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)
@@ -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()
@@ -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("<font color='red'>\icon[src] [src] shudders and shakes as some of it's damaged systems come back online.</font>")
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("<font color='blue'>\icon[src] [src] retracts several targetting vanes, and dulls it's running lights.</font>")
hostile = 0
else
src.visible_message("<font color='red'>\icon[src] [src] suddenly lights up, and additional targetting vanes slide into place.</font>")
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("<font color='blue'>\icon[src] [src] suddenly shuts down!</font>")
else
src.visible_message("<font color='blue'>\icon[src] [src] suddenly lies still and quiet.</font>")
disabled = rand(150, 600)
walk(src,0)
if(exploding && prob(20))
if(prob(50))
src.visible_message("<font color='red'>\icon[src] [src] begins to spark and shake violenty!</font>")
else
src.visible_message("<font color='red'>\icon[src] [src] sparks and shakes like it's about to explode!</font>")
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<num_boards, i++)
var/chosen = pick(options)
options.Remove(options.Find(chosen))
spawnees |= chosen
if(spawnees & 1)
C = new(src.loc)
C.name = "Drone CPU motherboard"
C.origin_tech = list(TECH_DATA = rand(3, 6))
if(spawnees & 2)
C = new(src.loc)
C.name = "Drone neural interface"
C.origin_tech = list(TECH_BIO = rand(3,6))
if(spawnees & 4)
C = new(src.loc)
C.name = "Drone suspension processor"
C.origin_tech = list(TECH_MAGNET = rand(3,6))
if(spawnees & 8)
C = new(src.loc)
C.name = "Drone shielding controller"
C.origin_tech = list(TECH_BLUESPACE = rand(3,6))
if(spawnees & 16)
C = new(src.loc)
C.name = "Drone power capacitor"
C.origin_tech = list(TECH_POWER = rand(3,6))
if(spawnees & 32)
C = new(src.loc)
C.name = "Drone hull reinforcer"
C.origin_tech = list(TECH_MATERIAL = rand(3,6))
if(spawnees & 64)
C = new(src.loc)
C.name = "Drone auto-repair system"
C.origin_tech = list(TECH_ENGINEERING = rand(3,6))
if(spawnees & 128)
C = new(src.loc)
C.name = "Drone phoron overcharge counter"
C.origin_tech = list(TECH_PHORON = rand(3,6))
if(spawnees & 256)
C = new(src.loc)
C.name = "Drone targetting circuitboard"
C.origin_tech = list(TECH_COMBAT = rand(3,6))
if(spawnees & 512)
C = new(src.loc)
C.name = "Corrupted drone morality core"
C.origin_tech = list(TECH_ILLEGAL = rand(3,6))
..()
/obj/item/projectile/beam/drone
damage = 15
/obj/item/projectile/beam/pulse/drone
damage = 10
// A slightly easier drone, for POIs.
// Difference is that it should not be faster than you.
/mob/living/simple_mob/hostile/malf_drone/lesser
desc = "An automated combat drone with an aged apperance."
returns_home = TRUE
move_to_delay = 6
@@ -1,84 +0,0 @@
/mob/living/simple_mob/hostile/faithless
name = "Faithless"
desc = "The Wish Granter's faith in humanity, incarnate"
icon_state = "faithless"
icon_living = "faithless"
icon_dead = "faithless_dead"
faction = "faithless"
intelligence_level = SA_HUMANOID
maxHealth = 50
health = 50
speed = 8
turns_per_move = 5
response_help = "passes through"
response_disarm = "shoves"
response_harm = "hits"
harm_intent_damage = 10
melee_damage_lower = 10
melee_damage_upper = 18
attack_armor_pen = 5 //It's a horror from beyond, I ain't gotta explain 5 AP
attacktext = list("gripped")
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
speak_chance = 0
/mob/living/simple_mob/hostile/faithless/Process_Spacemove(var/check_drift = 0)
return 1
/mob/living/simple_mob/hostile/faithless/set_target()
. = ..()
if(.)
audible_emote("wails at [target_mob]")
/mob/living/simple_mob/hostile/faithless/PunchTarget()
. = ..()
var/mob/living/L = .
if(istype(L))
if(prob(12))
L.Weaken(3)
L.visible_message("<span class='danger'>\the [src] knocks down \the [L]!</span>")
/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()
@@ -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("<b>[src]</b> 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("<font color='red'><B>The [src] warps in!</font></B>")
playsound(src.loc, 'sound/effects/EMPulse.ogg', 25, 1)
warpbots()
icon_state = "def_radar"
visible_message("<font color='red'>The [src] turns on!</font>")
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
@@ -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("<b>[src]</b> 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("<span class='danger'>\the [src] knocks down \the [L]!</span>")
//
// 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("<span class='danger'>\the [src] knocks down \the [L]!</span>")
@@ -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("<font color='red'>[src] lets out a contented sigh as their form unwinds.</font>")
ghostize()
qdel(src)
return
@@ -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, "<span class='warning'>You cannot move, there are eyes on you!</span>")
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("<span class='warning'>[user] tries to banish [src] with [O]!</span>")
if(do_after(user, 15, src))
if(banishable)
visible_message("<span class='warning'>[src] crumbles into dust!</span>")
gib()
else
visible_message("<span class='warning'>[src] is too strong to be banished!</span>")
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, "<span class='warning'>You cannot move, there are eyes on you!</span>")
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("<span class='notice'>Your eyes feel very heavy.</span>", "<span class='notice'>You blink suddenly!</span>", "<span class='notice'>Your eyes close involuntarily!</span>"))
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, "<span class='warning'>You cannot attack, there are eyes on you!</span>")
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 = "<span class='notice'>You glare your eyes.</span>"
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 = "<span class='notice'>You glare your eyes.</span>"
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, "<span class='warning'>You rub the slab in hopes a wandering spirit wishes to inhabit it. [src] starts to sparkle!</span>")
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("<span class='warning'>[src] fades. Maybe it will spark another time.</span>")
/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, "<b>You are \a [S], brought into existence on [station_name()] by [user]! Obey all their orders.</b>")
S.mind.assigned_role = "The Statue"
visible_message("<span class='warning'>The slab suddenly takes the shape of a humanoid!</span>")
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("<span class='warning'>The slab suddenly takes the shape of a humanoid!</span>")
S.creator = user
qdel(src)
@@ -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("<span class='danger'>\the [src] scares \the [L]!</span>")
/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()
@@ -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
..()
@@ -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
@@ -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("<span class='danger'>\the [src] knocks down \the [L]!</span>")
@@ -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)
@@ -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("<font color='blue'>[user] baps [name] on the nose with the rolled up [O]</font>")
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 << "<font color='red'>You can't fit this on [src]</font>"
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, "<font color='red'>[src] already has a cute bow!</font>")
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"
@@ -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 = "<div align='center'><b>Inventory of [name]</b></div><p>"
if(inventory_head)
dat += "<br><b>Head:</b> [inventory_head] (<a href='?src=\ref[src];remove_inv=head'>Remove</a>)"
else
dat += "<br><b>Head:</b> <a href='?src=\ref[src];add_inv=head'>Nothing</a>"
if(inventory_back)
dat += "<br><b>Back:</b> [inventory_back] (<a href='?src=\ref[src];remove_inv=back'>Remove</a>)"
else
dat += "<br><b>Back:</b> <a href='?src=\ref[src];add_inv=back'>Nothing</a>"
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 << "<span class='warning'>This animal is wearing too much armor. You can't cause them any damage.</span>"
for (var/mob/M in viewers(src, null))
M.show_message("<span class='warning'><B>[user] hits [src] with the [O], however [src] is too armored.</B></span>")
else
usr << "<span class='warning'>This animal is wearing too much armor. You can't reach its skin.</span>"
for (var/mob/M in viewers(src, null))
M.show_message("<span class='warning'>[user] gently taps [src] with the [O].</span>")
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, "<span class='warning'>There is nothing to remove from its [remove_from].</span>")
return
if("back")
if(inventory_back)
inventory_back.loc = src.loc
inventory_back = null
regenerate_icons()
else
to_chat(usr, "<span class='warning'>There is nothing to remove from its [remove_from].</span>")
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 << "<span class='warning'>You have nothing in your hand to put on its [add_to].</span>"
return
switch(add_to)
if("head")
if(inventory_head)
usr << "<span class='warning'>It's is already wearing something.</span>"
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 << "<span class='warning'>It doesn't seem too keen on wearing that item.</span>"
return
usr.drop_item()
place_on_head(item_to_add)
if("back")
if(inventory_back)
usr << "<span class='warning'>It's already wearing something.</span>"
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 << "<span class='warning'>This object won't fit.</span>"
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."
@@ -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")
@@ -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"
@@ -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("<span class='warning'>\The [src][is_dead()?"'s corpse":""] flails at [M]!</span>")
SpinAnimation(7,1)
if(prob(75))
if(sting(M))
to_chat(M, "<span class='warning'>You feel a tiny prick.</span>")
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
@@ -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.")
@@ -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 << "<span class='notice'>[src] ignores you.</span>"
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
@@ -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("<span class='notice'>\The [src]'s abdomen splits as it rolls over, spiderlings crawling from the wound.</span>")
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 <font face='comic sans ms'>bad</font> 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("<span class='danger'>\The [src]'s body begins to rupture!</span>")
spawn(rand(1,5))
if(src && !exploded)
visible_message("<span class='critical'>\The [src]'s body detonates!</span>")
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, "<span class='warning'>You feel a tiny prick.</span>")
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, "<font size='3'><span class='warning'>\The [src] injects something into your [O.name]!</span></font>")
/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("<span class='danger'>\The [src] throws a layer of web at \the [L]!</span>")
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("<span class='notice'>\The [src] begins to secrete a sticky substance.</span>")
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("<span class='notice'>\The [src] begins to lay a cluster of eggs.</span>")
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("<span class='notice'>\The [src] begins to secrete a sticky substance around \the [cocoon_target].</span>")
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("<span class='warning'>\The [src] sticks a proboscis into \the [cocoon_target] and sucks a viscous substance out.</span>")
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
@@ -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"
@@ -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!
@@ -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")
@@ -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"
@@ -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("<font color='blue'>\icon[src] Squeek!</font>")
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
@@ -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!
@@ -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 = "<div align='center'><b>Inventory of [name]</b></div><p>"
if(ears)
dat += "<br><b>Headset:</b> [ears] (<a href='?src=\ref[src];remove_inv=ears'>Remove</a>)"
else
dat += "<br><b>Headset:</b> <a href='?src=\ref[src];add_inv=ears'>Nothing</a>"
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, "<font color='red'>There is nothing to remove from its [remove_from].</font>")
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, "<font color='red'>You have nothing in your hand to put on its [add_to].</font>")
return
switch(add_to)
if("ears")
if(ears)
to_chat(usr, "<font color='red'>It's already wearing something.</font>")
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, "<font color='red'>This object won't fit.</font>")
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]!", "<font color='blue'>You grab the [held_item]!</font>", "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, "<font color='red'>You are already holding the [held_item]</font>")
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]!", "<font color='blue'>You grab the [held_item]!</font>", "You hear the sounds of wings flapping furiously.")
return held_item
to_chat(src, "<font color='red'>There is nothing of interest to take.</font>")
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, "<font color='red'>You are already holding the [held_item]</font>")
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!", "<font color='blue'>You snag the [held_item] out of [C]'s hand!</font>", "You hear the sounds of wings flapping furiously.")
return held_item
to_chat(src, "<font color='red'>There is nothing of interest to take.</font>")
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, "<font color='red'>You have nothing to drop!</font>")
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, "<font color='red'>There is no perch nearby to sit on.</font>")
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
@@ -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
@@ -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
@@ -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)
@@ -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("<span class='notice'>[src] swallows the [movement_target] whole!</span>")
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("<span class='notice'>[user] feeds \the [O] to [src].</span>")
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)
..()
@@ -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 << "<span class='warning'>There's already a brain in [src]!</span>"
return
if(!B.brainmob)
user << "<span class='warning'>Sticking an empty MMI into the frame would sort of defeat the purpose.</span>"
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 << "<span class='notice'>[O] is completely unresponsive; there's no point.</span>"
return
if(B.brainmob.stat == DEAD)
user << "<span class='warning'>[O] is dead. Sticking it into the frame would sort of defeat the purpose.</span>"
return
if(jobban_isbanned(B.brainmob, "Cyborg"))
user << "<span class='warning'>\The [O] does not seem to fit.</span>"
return
user << "<span class='notice'>You install \the [O] in \the [src]!</span>"
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("<span class='notice'>\The [user] has spot-welded some of the damage to \the [src]!</span>")
else
user << "<span class='warning'>\The [src] is undamaged!</span>"
else
user << "<span class='danger'>You need more welding fuel for this task!</span>"
return
else if(istype(O, /obj/item/weapon/card/id)||istype(O, /obj/item/device/pda))
if (!mmi)
user << "<span class='danger'>There's no reason to swipe your ID - \the [src] has no brain to remove.</span>"
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 << "<span class='notice'>You swipe your access card and pop the brain out of \the [src].</span>"
eject_brain()
if(held_item)
held_item.forceMove(src.loc)
held_item = null
return 1
else
user << "<span class='danger'>You swipe your card with no effect.</span>"
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 << "<span class='warning'>[src] is already overloaded - better run.</span>"
return 0
else
user << "<span class='notice'>You short out the security protocols and overload [src]'s cell, priming it to explode in a short time.</span>"
spawn(100)
to_chat(src, "<span class='danger'>Your cell seems to be outputting a lot of power...</span>")
spawn(200)
to_chat(src, "<span class='danger'>Internal heat sensors are spiking! Something is badly wrong with your cell!</span>")
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("<span class='danger'>\The [src] makes an odd warbling noise, fizzles, and explodes!</span>")
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 << "<font color='red'>You have nothing to drop!</font>"
return 0
if(istype(held_item, /obj/item/weapon/grenade))
visible_message("<span class='danger'>\The [src] launches \the [held_item]!</span>", \
"<span class='danger'>You launch \the [held_item]!</span>", \
"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("<span class='notice'>\The [src] drops \the [held_item].</span>", \
"<span class='notice'>You drop \the [held_item].</span>", \
"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, "<span class='warning'>You are already holding \the [held_item]</span>")
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("<span class='notice'>\The [src] scoops up \the [held_item].</span>", \
"<span class='notice'>You grab \the [held_item].</span>", \
"You hear a skittering noise and a clink.")
return held_item
to_chat(src, "<span class='warning'>\The [selection] is too far away.</span>")
return 0
to_chat(src, "<span class='warning'>There is nothing of interest to take.</span>")
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
@@ -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
@@ -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("<span class='danger'>\the [src] knocks down \the [L]!</span>")
/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)
@@ -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
@@ -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")
@@ -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"
@@ -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
@@ -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
@@ -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("<span class='danger'>\The [src] blocks \the [O] with its shield!</span>")
if(user)
react_to_attack(user)
return
else
..()
else
usr << "<span class='warning'>This weapon is ineffective, it does no damage.</span>"
visible_message("<span class='warning'>\The [user] gently taps [src] with \the [O].</span>")
/mob/living/simple_mob/hostile/syndicate/melee/bullet_act(var/obj/item/projectile/Proj)
if(!Proj) return
if(prob(35))
visible_message("<font color='red'><B>[src] blocks [Proj] with its shield!</B></font>")
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)
File diff suppressed because it is too large Load Diff
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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"
@@ -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
@@ -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
@@ -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")
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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.
@@ -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,"<span class='notice'>The guard pup accepts your offer for their catch.</span>")
release_vore_contents()
else if(prob(2)) //Small chance to get prey out from non-sec oties.
to_chat(user,"<span class='notice'>The pup accepts your offer for their catch.</span>")
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 <b>[target_name(prey)]</b> in <b>[get_area(src)]</b>.", "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 <b>[target_name(M)]</b> in <b>[get_area(src)]</b>.", "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("<span class='notice'>[M] [response_help] \the [src].</span>")
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
@@ -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
@@ -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("<span class='danger'>\the [src] pounces on \the [food]!</span>!")
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
@@ -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
@@ -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
@@ -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,"<span class='notice'><b>[name]</b> (Cost: [cost]%) - [desc]</span>")
else
do_ability(my_kin)
/obj/effect/shadekin_ability/proc/do_ability()
if(my_kin.stat)
to_chat(my_kin,"<span class='warning'>Can't use that ability in your state!</span>")
return FALSE
if(shift_mode == NOT_WHILE_SHIFTED && (my_kin.ability_flags & AB_PHASE_SHIFTED))
to_chat(my_kin,"<span class='warning'>Can't use that ability while phase shifted!</span>")
return FALSE
else if(shift_mode == ONLY_WHILE_SHIFTED && !(my_kin.ability_flags & AB_PHASE_SHIFTED))
to_chat(my_kin,"<span class='warning'>Can only use that ability while phase shifted!</span>")
return FALSE
else if(my_kin.energy < cost)
to_chat(my_kin,"<span class='warning'>Not enough energy for that ability!</span>")
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 = "<span class='notice'>Sparkles begin to appear around you, and all your ills seem to fade away.</span>"
on_expired_text = "<span class='notice'>The sparkles have faded, although you feel much healthier than before.</span>"
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 = "<span class='notice'>You drag part of The Dark into realspace, enveloping yourself.</span>"
on_expired_text = "<span class='warning'>You lose your grasp on The Dark and realspace reasserts itself.</span>"
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
*/
@@ -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,"<span class='warning'>You can't use that here!</span>")
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,"<span class='warning'>\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!</span>")
// 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,"<span class='warning'>Nobody nearby to mend!</span>")
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("<span class='notice'>\The [src] gently places a hand on \the [target]...</span>")
face_atom(target)
return TRUE
@@ -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("<span class='notice'>\The [src] [pick(friendly)] \the [henlo_human].</span>")
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
@@ -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."
@@ -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
@@ -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.
@@ -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 dont 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("<span class='danger'>The grub releases a powerful shock!</span>")
..()
/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("<span class='notice'>\The [src] begins to sink power from the net.</span>")
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 << "<span class='warning'>You feel a shock rushing through your veins.</span>"
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
@@ -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("<span class='warning'>\The [src] finds an opening and crawls inside \the [M].</span>")
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("<span class='warning'>\The [src] suddenly balloons in size!</span>")
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, "<span class='warning'>You disturb a grub nesting in \the [O]!</span>")
return
return ..()
@@ -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
@@ -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
@@ -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("<span class='warning'>\The [src] pounces on \the [target_mob]!]</span>")
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.
@@ -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.
@@ -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"
+1 -1
View File
@@ -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)
@@ -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"
+4
View File
@@ -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" = (
+2
View File
@@ -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" = (