fix and merge conflicting files

This commit is contained in:
kcin2001
2019-08-25 22:25:15 -07:00
102 changed files with 5391 additions and 2263 deletions
@@ -99,3 +99,13 @@
display_name = "Cards Against The Galaxy (black deck)"
path = /obj/item/weapon/deck/cah/black
description = "The ever-popular Cards Against The Galaxy word game. Warning: may include traces of broken fourth wall. This is the black deck."
/datum/gear/cagsewhite
display_name = "Cards Against The Galaxy: Special Edition (white deck)"
path = /obj/item/weapon/deck/cagse
description = "The ever-popular Cards Against The Galaxy: Special Edition word game. Warning: may include traces of broken fourth wall and obscenity. This is the white deck."
/datum/gear/cagseblack
display_name = "Cards Against The Galaxy: Special Edition (black deck)"
path = /obj/item/weapon/deck/cagse/black
description = "The ever-popular Cards Against The Galaxy: Special Edition word game. Warning: may include traces of broken fourth wall and obscenity. This is the black deck."
@@ -1,3 +1,16 @@
//CHOMPEDIT; SYNTH FACEMASK
/datum/gear/mask/synthface/
display_name = "Synth Facemask(Tesh)"
path = /obj/item/clothing/mask/synthfacemask
sort_category = "Xenowear"
whitelisted = SPECIES_TESHARI
cost = 1
//CHOMPEDIT; END
/datum/gear/mask/synthface/New()
..()
gear_tweaks = list(gear_tweak_free_color_choice)
/datum/gear/uniform/voxcasual
display_name = "casual wear (Vox)"
path = /obj/item/clothing/under/vox/vox_casual
@@ -37,4 +50,4 @@
/datum/gear/uniform/loincloth
display_name = "loincloth"
path = /obj/item/clothing/suit/storage/fluff/loincloth
sort_category = "Xenowear"
sort_category = "Xenowear"
+9 -1
View File
@@ -11,4 +11,12 @@
var/image/so_far = ..()
so_far.pixel_y += 16
so_far.pixel_x += 0
return so_far
return so_far
/obj/item/clothing/head/soft/purple/wah
name = "assistant cap"
desc = "What a lovely purple cap, its said its given out as a trophy to assistants. Why does that sound so depressing?"
icon_state = "wahcap"
item_state_slots = list(slot_r_hand_str = "wahcap", slot_l_hand_str = "wahcap")
icon = 'icons/obj/clothing/hats_vr.dmi'
icon_override = 'icons/mob/head_vr.dmi'
+34 -1
View File
@@ -66,4 +66,37 @@
monitor_state_index = initial(monitor_state_index)
icon_state = monitor_states[monitor_state_index]
var/mob/living/carbon/human/H = loc
if(istype(H)) H.update_inv_wear_mask()
if(istype(H)) H.update_inv_wear_mask()
//TESHARI FACE MASK //Defning all the procs in one go
/obj/item/clothing/mask/synthfacemask
name = "Synth Face"
desc = "A round dark muzzle made of LEDs."
body_parts_covered = FACE
icon = 'icons/mob/species/seromi/synth_facemask.dmi'
icon_override = 'icons/mob/species/seromi/synth_facemask.dmi'
icon_state = "synth_facemask"
origin_tech = list(TECH_ILLEGAL = 1)
equipped()
..()
var/mob/living/carbon/human/H = loc
if(istype(H) && H.wear_mask == src)
canremove = 0
dropped()
canremove = 1
return ..()
mob_can_equip(var/mob/living/carbon/human/user, var/slot)
if (!..())
return 0
if(istype(user))
var/obj/item/organ/external/E = user.organs_by_name[BP_HEAD]
if(istype(E) && (E.robotic >= ORGAN_ROBOT))
return 1
user << "<span class='warning'>You must have a compatible robotic head to install this upgrade.</span>"
return 0
update_icon()
var/mob/living/carbon/human/H = loc
if(istype(H)) H.update_inv_wear_mask()
if (H.stat == DEAD) icon_state = "synth_facemask_dead"
+13 -1
View File
@@ -853,4 +853,16 @@
/obj/item/clothing/under/cohesion/hazard
name = "hazard cohesion suit"
desc = "An orange cohesion suit with yellow hazard stripes intended to assist Prometheans in maintaining their form and prevent direct skin exposure."
icon_state = "cohesionsuit_hazard"
icon_state = "cohesionsuit_hazard"
/obj/item/clothing/under/sexybunny_white
name = "Bunny girl suit"
desc = "this seems to come with extra padding, exaggerating the chest some."
icon_state = "sexybunny_white"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
/obj/item/clothing/under/sexybunny_black
name = "Bunny girl suit"
desc = "this seems to come with extra padding, exaggerating the chest some."
icon_state = "sexybunny_black"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS
+173
View File
@@ -0,0 +1,173 @@
/obj/item/weapon/spacecasinocash
name = "broken casino chip"
desc = "It's worth nothing in a casino."
gender = PLURAL
icon = 'icons/obj/casino.dmi'
icon_state = "spacecasinocash1"
opacity = 0
density = 0
anchored = 0.0
force = 1.0
throwforce = 1.0
throw_speed = 1
throw_range = 2
w_class = ITEMSIZE_SMALL
var/access = list()
access = access_crate_cash
var/worth = 0
/obj/item/weapon/spacecasinocash/attackby(obj/item/weapon/W as obj, mob/user as mob)
if(istype(W, /obj/item/weapon/spacecasinocash))
if(istype(W, /obj/item/weapon/spacecasinocash/ewallet)) return 0
var/obj/item/weapon/spacecasinocash/SC = W
SC.adjust_worth(src.worth)
if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/h_user = user
h_user.drop_from_inventory(src)
h_user.drop_from_inventory(SC)
h_user.put_in_hands(SC)
user << "<span class='notice'>You combine the casino chips to a stack of [SC.worth] of credits.</span>"
qdel(src)
/obj/item/weapon/spacecasinocash/update_icon()
overlays.Cut()
name = "[worth] casino credit\s"
if(worth in list(1000,500,200,100,50,20,10,1))
icon_state = "spacecasinocash[worth]"
desc = "It's a stack of casino chips with a combined value of [worth] credits."
return
var/sum = src.worth
var/num = 0
for(var/i in list(1000,500,200,100,50,20,10,1))
while(sum >= i && num < 50)
sum -= i
num++
var/image/banknote = image('icons/obj/casino.dmi', "spacecasinocash[i]")
var/matrix/M = matrix()
M.Translate(rand(-6, 6), rand(-4, 8))
M.Turn(pick(-45, -27.5, 0, 0, 0, 0, 0, 0, 0, 27.5, 45))
banknote.transform = M
src.overlays += banknote
if(num == 0) // Less than one credit, let's just make it look like 1 for ease
var/image/banknote = image('icons/obj/casino.dmi', "spacecasinocash1")
var/matrix/M = matrix()
M.Translate(rand(-6, 6), rand(-4, 8))
M.Turn(pick(-45, -27.5, 0, 0, 0, 0, 0, 0, 0, 27.5, 45))
banknote.transform = M
src.overlays += banknote
src.desc = "They are worth [worth] of credits."
/obj/item/weapon/spacecasinocash/proc/adjust_worth(var/adjust_worth = 0, var/update = 1)
worth += adjust_worth
if(worth > 0)
if(update)
update_icon()
return worth
else
qdel(src)
return 0
/obj/item/weapon/spacecasinocash/proc/set_worth(var/new_worth = 0, var/update = 1)
worth = max(0, new_worth)
if(update)
update_icon()
return worth
/obj/item/weapon/spacecasinocash/attack_self()
var/amount = input(usr, "How much credits worth of chips do you want to take? (0 to [src.worth])", "Take chips", 20) as num
amount = round(Clamp(amount, 0, src.worth))
if(!amount)
return
adjust_worth(-amount)
var/obj/item/weapon/spacecasinocash/SC = new (usr.loc)
SC.set_worth(amount)
usr.put_in_hands(SC)
/obj/item/weapon/spacecasinocash/c1
name = "1 credit casino chip"
icon_state = "spacecasinocash1"
desc = "It's worth 1 credit."
worth = 1
/obj/item/weapon/spacecasinocash/c10
name = "10 credit casino chip"
icon_state = "spacecasinocash10"
desc = "It's worth 10 credits."
worth = 10
/obj/item/weapon/spacecasinocash/c20
name = "20 credit casino chip"
icon_state = "spacecasinocash20"
desc = "It's worth 20 credits."
worth = 20
/obj/item/weapon/spacecasinocash/c50
name = "50 credit casino chip"
icon_state = "spacecasinocash50"
desc = "It's worth 50 credits."
worth = 50
/obj/item/weapon/spacecasinocash/c100
name = "100 credit casino chip"
icon_state = "spacecasinocash100"
desc = "It's worth 100 credits."
worth = 100
/obj/item/weapon/spacecasinocash/c200
name = "200 credit casino chip"
icon_state = "spacecasinocash200"
desc = "It's worth 200 credits."
worth = 200
/obj/item/weapon/spacecasinocash/c500
name = "500 credit casino chip"
icon_state = "spacecasinocash500"
desc = "It's worth 500 credits."
worth = 500
/obj/item/weapon/spacecasinocash/c1000
name = "1000 credit casino chip"
icon_state = "spacecasinocash1000"
desc = "It's worth 1000 credits."
worth = 1000
proc/spawn_casinochips(var/sum, spawnloc, mob/living/carbon/human/human_user as mob)
var/obj/item/weapon/spacecasinocash/SC = new (spawnloc)
SC.set_worth(sum)
if (ishuman(human_user) && !human_user.get_active_hand())
human_user.put_in_hands(SC)
return
/obj/item/weapon/spacecasinocash/ewallet
name = "Casino chip card"
icon_state = "efundcard"
desc = "A casino card that can hold credits."
var/owner_name = "" //So the ATM can set it so the EFTPOS can put a valid name on transactions.
attack_self() return //Don't act
attackby() return //like actual
update_icon() return //space cash
/obj/item/weapon/spacecasinocash/ewallet/examine(mob/user)
..(user)
if (!(user in view(2)) && user!=src.loc) return
user << "<font color='#6F6FE2'>Casino chip card's owner: [src.owner_name]. credits remaining: [src.worth].</font>"
/obj/item/weapon/casin_platinum_chip
name = "platinum chip"
desc = "Ringa-a-Ding-Ding!"
icon = 'icons/obj/casino.dmi'
icon_state = "platinum_chip"
opacity = 0
density = 0
anchored = 0.0
force = 1.0
throwforce = 1.0
throw_speed = 1
throw_range = 2
w_class = ITEMSIZE_SMALL
+149 -147
View File
@@ -1,148 +1,150 @@
#define ASSIGNMENT_ANY "Any"
#define ASSIGNMENT_AI "AI"
#define ASSIGNMENT_CYBORG "Cyborg"
#define ASSIGNMENT_ENGINEER "Engineer"
#define ASSIGNMENT_GARDENER "Gardener"
#define ASSIGNMENT_JANITOR "Janitor"
#define ASSIGNMENT_MEDICAL "Medical"
#define ASSIGNMENT_SCIENTIST "Scientist"
#define ASSIGNMENT_SECURITY "Security"
#define ASSIGNMENT_HOS "Head of Security"
#define ASSIGNMENT_WARDEN "Warden"
//
// VOREStation overrides to the default event manager configuration.
//
// This file lets us configure which events we want in the rotation without conflicts with upstream.
// It works because the actual event containers don't define New(), allowing us to use New() to replace
// the lists of available events. If they ever do define New() this will need to be changed.
//
// Specifically the change is to move events we don't want down into the disabled_events list
//
// Adds a list of pre-disabled events to the available events list.
// This keeps them in the rotation, but disabled, so they can be enabled with a click if desired that round.
/datum/event_container/proc/add_disabled_events(var/list/disabled_events)
for(var/datum/event_meta/EM in disabled_events)
EM.enabled = 0
available_events += EM
/datum/event_container/mundane/New()
available_events = list(
// Severity level, event name, even type, base weight, role weights, one shot, min weight, max weight. Last two only used if set and non-zero
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Nothing", /datum/event/nothing, 200),
// Bluescreens APCs, but they still work
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "APC Damage", /datum/event/apc_damage, 20, list(ASSIGNMENT_ENGINEER = 20)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Brand Intelligence",/datum/event/brand_intelligence,20, list(ASSIGNMENT_JANITOR = 25), 1),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Camera Damage", /datum/event/camera_damage, 20, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_AI = 40)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Canister Leak", /datum/event/canister_leak, 10, list(ASSIGNMENT_ENGINEER = 20)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Economic News", /datum/event/economic_event, 300),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Electrified Door", /datum/event/electrified_door, -5, list(ASSIGNMENT_MEDICAL = 5, ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_AI = 10)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lost Carp", /datum/event/carp_migration, 0, list(ASSIGNMENT_SECURITY = 40), 1),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Meteor Shower", /datum/event/meteor_wave, 20, list(ASSIGNMENT_ENGINEER = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Lotto", /datum/event/money_lotto, 0, list(ASSIGNMENT_ANY = 1), 1, 5, 15),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Shipping Error", /datum/event/shipping_error , 30, list(ASSIGNMENT_ANY = 2), 0),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Supply Demand", /datum/event/supply_demand, -15, list(ASSIGNMENT_ANY = 1, ASSIGNMENT_ENGINEER = 5, ASSIGNMENT_MEDICAL = 5), 1),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Trivial News", /datum/event/trivial_news, 400),
// Spawns mice, or lizards.
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Vermin Infestation",/datum/event/infestation, 100, list(ASSIGNMENT_JANITOR = 100), 1),
//Split spiderlings off from the vermin infestation event into its own thing, triggered only by security.
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Spiderling Infestation",/datum/event/spiderling_infestation, 0, list(ASSIGNMENT_SECURITY = 50), 1),
// Rot only weakens walls, not destroy them
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 30, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50), 1),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Window Damage", /datum/event/window_break, 10, list(ASSIGNMENT_ENGINEER = 20)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Viral Infection", /datum/event/viral_infection, -25, list(ASSIGNMENT_MEDICAL = 5), 1),
)
add_disabled_events(list(
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Ian Storm", /datum/event/ianstorm, 1, list(), 1),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Hacker", /datum/event/money_hacker, 0, list(ASSIGNMENT_ANY = 4), 1, 10, 25),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "PDA Spam", /datum/event/pda_spam, 0, list(ASSIGNMENT_ANY = 4), 1, 25, 50),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Space Dust", /datum/event/dust, 50, list(ASSIGNMENT_ENGINEER = 20), 1, 0, 50),
))
/datum/event_container/moderate/New()
available_events = list(
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Nothing", /datum/event/nothing, 800),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Appendicitis", /datum/event/spontaneous_appendicitis, -10, list(ASSIGNMENT_MEDICAL = 30), 1),
// Leaks gas into an unoccupied room.
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Atmos Leak", /datum/event/atmos_leak, 60, list(ASSIGNMENT_ENGINEER = 25), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Camera Damage", /datum/event/camera_damage, 20, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_AI = 40)),
// Just disables comms for a short while.
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Communication Blackout", /datum/event/communications_blackout, 50, list(ASSIGNMENT_AI = 150, ASSIGNMENT_SECURITY = 120), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Carp School", /datum/event/carp_migration, -20, list(ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_SECURITY = 30, ASSIGNMENT_HOS = 10, ASSIGNMENT_WARDEN = 5), 1),
// Just blows out a few lights
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Electrical Storm", /datum/event/electrical_storm, 60, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_JANITOR = 150), 1),
// This one is just too fun.
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Escaped Slimes", /datum/event/escaped_slimes, -40, list(ASSIGNMENT_SCIENTIST = 40, ASSIGNMENT_SECURITY = 30)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Gravity Failure", /datum/event/gravity, 65, list(ASSIGNMENT_ENGINEER = 10), 1),
// Temporary power failure, but mitigatead by subgrids
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grid Check", /datum/event/grid_check, 40, list(ASSIGNMENT_SCIENTIST = 10, ASSIGNMENT_ENGINEER = 25), 1),
//Evil grubs that drain station power slightly
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grub Infestation", /datum/event/grub_infestation, -20, list(ASSIGNMENT_SECURITY = 40, ASSIGNMENT_ENGINEER = 40), 1),
// Pure RP fun, no mechanical effects.
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Ion Storm", /datum/event/ionstorm, -50, list(ASSIGNMENT_AI = 200, ASSIGNMENT_CYBORG = 100, ASSIGNMENT_ENGINEER = 15, ASSIGNMENT_SCIENTIST = 5), 0),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Meteor Shower", /datum/event/meteor_wave, -20, list(ASSIGNMENT_ENGINEER = 40), 1),
//New CHOMPStation event. Mice grow into rats.
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Mutants", /datum/event/mutants, 20, list(ASSIGNMENT_ANY = 15, ASSIGNMENT_SECURITY = 50), 1),
// Opens doors in brig. So just RP fun
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Prison Break", /datum/event/prison_break, -10, list(ASSIGNMENT_SECURITY = 30, ASSIGNMENT_ENGINEER = 20), 1),
// Not bad (dorms are shielded) but inconvenient
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Radiation Storm", /datum/event/radiation_storm, 0, list(ASSIGNMENT_MEDICAL = 35), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Rogue Drones", /datum/event/rogue_drone, -30, list(ASSIGNMENT_SECURITY = 25, ASSIGNMENT_HOS = 35, ASSIGNMENT_WARDEN = 35)),
// Radiation, but only in space.
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Solar Storm", /datum/event/solar_storm, 5, list(ASSIGNMENT_ENGINEER = 40, ASSIGNMENT_SECURITY = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation", /datum/event/spider_infestation, -20, list(ASSIGNMENT_SECURITY = 30, ASSIGNMENT_HOS = 20, ASSIGNMENT_WARDEN = 20), 0),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Viral Infection", /datum/event/viral_infection, -40, list(ASSIGNMENT_MEDICAL = 50), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Virology Breach", /datum/event/prison_break/virology, -10, list(ASSIGNMENT_MEDICAL = 30, ASSIGNMENT_ENGINEER = 20), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Wallrot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Wormholes", /datum/event/wormholes, 20, list(ASSIGNMENT_ANY = 5)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Xenobiology Breach", /datum/event/prison_break/xenobiology, -10, list(ASSIGNMENT_SCIENCE = 30, ASSIGNMENT_ENGINEER = 20), 1),
)
add_disabled_events(list(
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Carp School_NoRequirements", /datum/event/carp_migration, 100, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_SECURITY = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Escaped Slimes_NoRequirements", /datum/event/escaped_slimes, 30, list(ASSIGNMENT_SCIENTIST = 40, ASSIGNMENT_SECURITY = 30)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Meteor Shower_NoRequirements", /datum/event/meteor_wave, 30, list(ASSIGNMENT_ENGINEER = 20), 0),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation_NoRequirements", /datum/event/spider_infestation, 100, list(ASSIGNMENT_SECURITY = 40), 0),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Supply Demand", /datum/event/supply_demand, 0, list(ASSIGNMENT_ANY = 5, ASSIGNMENT_SCIENCE = 15, ASSIGNMENT_GARDENER = 10, ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_MEDICAL = 15), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Random Antagonist", /datum/event/random_antag, 3, list(ASSIGNMENT_SECURITY = 1), 1, 0, 5),
))
/datum/event_container/major/New()
available_events = list(
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Nothing", /datum/event/nothing, 900),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Atmos Leak", /datum/event/atmos_leak, 5, list(ASSIGNMENT_ENGINEER = 35), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Blob", /datum/event/blob, -100, list(ASSIGNMENT_SECURITY = 40, ASSIGNMENT_HOS = 10, ASSIGNMENT_WARDEN = 10, ASSIGNMENT_ENGINEER = 5), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Boss", /datum/event/boss, -110, list(ASSIGNMENT_SECURITY = 50, ASSIGNMENT_HOS = 10, ASSIGNMENT_WARDEN = 10), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Carp Migration", /datum/event/carp_migration, -110, list(ASSIGNMENT_SECURITY = 50, ASSIGNMENT_HOS = 10, ASSIGNMENT_WARDEN = 10), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Containment Breach", /datum/event/prison_break/station,0, list(ASSIGNMENT_ANY = 5), 0),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Escaped Slimes", /datum/event/escaped_slimes, -50, list(ASSIGNMENT_SCIENTIST = 30, ASSIGNMENT_SECURITY = 30), 1),
// TFF: Virgo event commented out. Technically meant for Tether maps, not Polaris.
// new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Strike", /datum/event/meteor_strike, 10, list(ASSIGNMENT_ENGINEER = 15), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, 0, list(ASSIGNMENT_ENGINEER = 15), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Metroid Infestation", /datum/event/metroid_infestation, -75, list(ASSIGNMENT_SECURITY = 35, ASSIGNMENT_SCIENCE = 20, ASSIGNMENT_HOS = 10, ASSIGNMENT_WARDEN = 10), 0),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Space Vines", /datum/event/spacevine, 20, list(ASSIGNMENT_ENGINEER = 15), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Spider Infestation", /datum/event/spider_infestation, -35, list(ASSIGNMENT_SECURITY = 30, ASSIGNMENT_HOS = 10, ASSIGNMENT_WARDEN = 10), 0),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Viral Infection", /datum/event/viral_infection, -50, list(ASSIGNMENT_MEDICAL = 25), 1),
)
add_disabled_events(list(
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Blob_NoRequirements", /datum/event/blob, 10, list(ASSIGNMENT_SECURITY = 10, ASSIGNMENT_ENGINEER = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Carp Migration_NoRequirements", /datum/event/carp_migration, 10, list(ASSIGNMENT_SECURITY = 10), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Escaped Slimes_NoRequirements", /datum/event/escaped_slimes, 30, list(ASSIGNMENT_SCIENTIST = 10, ASSIGNMENT_SECURITY = 5)),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave_NoRequirements", /datum/event/meteor_wave, 30, list(ASSIGNMENT_ENGINEER = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Spider Infestation_NoRequirements", /datum/event/spider_infestation, 30, list(ASSIGNMENT_SECURITY = 10), 0),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Supply Demand", /datum/event/supply_demand, 0, list(ASSIGNMENT_ANY = 5, ASSIGNMENT_SCIENCE = 15, ASSIGNMENT_GARDENER = 10, ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_MEDICAL = 15), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Viral Infection_NoRequirements", /datum/event/viral_infection, 50, list(ASSIGNMENT_MEDICAL = 50), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Space Dust", /datum/event/dust, 50, list(ASSIGNMENT_ENGINEER = 30), 0),
))
#undef ASSIGNMENT_ANY
#undef ASSIGNMENT_AI
#undef ASSIGNMENT_CYBORG
#undef ASSIGNMENT_ENGINEER
#undef ASSIGNMENT_GARDENER
#undef ASSIGNMENT_JANITOR
#undef ASSIGNMENT_MEDICAL
#undef ASSIGNMENT_SCIENTIST
#undef ASSIGNMENT_SECURITY
#undef ASSIGNMENT_HOS
#define ASSIGNMENT_ANY "Any"
#define ASSIGNMENT_AI "AI"
#define ASSIGNMENT_CYBORG "Cyborg"
#define ASSIGNMENT_ENGINEER "Engineer"
#define ASSIGNMENT_GARDENER "Gardener"
#define ASSIGNMENT_JANITOR "Janitor"
#define ASSIGNMENT_MEDICAL "Medical"
#define ASSIGNMENT_SCIENTIST "Scientist"
#define ASSIGNMENT_SECURITY "Security"
#define ASSIGNMENT_HOS "Head of Security"
#define ASSIGNMENT_WARDEN "Warden"
//
// VOREStation overrides to the default event manager configuration.
//
// This file lets us configure which events we want in the rotation without conflicts with upstream.
// It works because the actual event containers don't define New(), allowing us to use New() to replace
// the lists of available events. If they ever do define New() this will need to be changed.
//
// Specifically the change is to move events we don't want down into the disabled_events list
//
// Adds a list of pre-disabled events to the available events list.
// This keeps them in the rotation, but disabled, so they can be enabled with a click if desired that round.
/datum/event_container/proc/add_disabled_events(var/list/disabled_events)
for(var/datum/event_meta/EM in disabled_events)
EM.enabled = 0
available_events += EM
/datum/event_container/mundane/New()
available_events = list(
// Severity level, event name, even type, base weight, role weights, one shot, min weight, max weight. Last two only used if set and non-zero
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Nothing", /datum/event/nothing, 200),
// Bluescreens APCs, but they still work
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "APC Damage", /datum/event/apc_damage, 20, list(ASSIGNMENT_ENGINEER = 20)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Brand Intelligence",/datum/event/brand_intelligence,20, list(ASSIGNMENT_JANITOR = 25), 1),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Camera Damage", /datum/event/camera_damage, 20, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_AI = 40)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Canister Leak", /datum/event/canister_leak, 10, list(ASSIGNMENT_ENGINEER = 20)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Economic News", /datum/event/economic_event, 300),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Electrified Door", /datum/event/electrified_door, -5, list(ASSIGNMENT_MEDICAL = 5, ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_AI = 10)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Lost Carp", /datum/event/carp_migration, 0, list(ASSIGNMENT_SECURITY = 40), 1),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Meteor Shower", /datum/event/meteor_wave, -20, list(ASSIGNMENT_ENGINEER = 50), 1),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Lotto", /datum/event/money_lotto, 0, list(ASSIGNMENT_ANY = 1), 1, 5, 15),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Shipping Error", /datum/event/shipping_error , 30, list(ASSIGNMENT_ANY = 2), 0),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Supply Demand", /datum/event/supply_demand, -15, list(ASSIGNMENT_ANY = 1, ASSIGNMENT_ENGINEER = 5, ASSIGNMENT_MEDICAL = 5), 1),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Trivial News", /datum/event/trivial_news, 400),
// Spawns mice, or lizards.
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Vermin Infestation",/datum/event/infestation, 100, list(ASSIGNMENT_JANITOR = 100), 1),
//Split spiderlings off from the vermin infestation event into its own thing, triggered only by security.
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Spiderling Infestation",/datum/event/spiderling_infestation, -30, list(ASSIGNMENT_SECURITY = 25), 1),
// Rot only weakens walls, not destroy them
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 30, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50), 1),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Window Damage", /datum/event/window_break, 10, list(ASSIGNMENT_ENGINEER = 20)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Viral Infection", /datum/event/viral_infection, -25, list(ASSIGNMENT_MEDICAL = 5), 1),
)
add_disabled_events(list(
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Ian Storm", /datum/event/ianstorm, 1, list(), 1),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Money Hacker", /datum/event/money_hacker, 0, list(ASSIGNMENT_ANY = 4), 1, 10, 25),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "PDA Spam", /datum/event/pda_spam, 0, list(ASSIGNMENT_ANY = 4), 1, 25, 50),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Space Dust", /datum/event/dust, 50, list(ASSIGNMENT_ENGINEER = 20), 1, 0, 50),
))
/datum/event_container/moderate/New()
available_events = list(
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Nothing", /datum/event/nothing, 800),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Appendicitis", /datum/event/spontaneous_appendicitis, -10, list(ASSIGNMENT_MEDICAL = 30), 1),
// Leaks gas into an unoccupied room.
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Atmos Leak", /datum/event/atmos_leak, 60, list(ASSIGNMENT_ENGINEER = 25), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Camera Damage", /datum/event/camera_damage, 20, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_AI = 40)),
// Just disables comms for a short while.
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Communication Blackout", /datum/event/communications_blackout, 50, list(ASSIGNMENT_AI = 150, ASSIGNMENT_SECURITY = 120), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Carp School", /datum/event/carp_migration, -20, list(ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_SECURITY = 30, ASSIGNMENT_HOS = 10, ASSIGNMENT_WARDEN = 5), 1),
// Just blows out a few lights
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Electrical Storm", /datum/event/electrical_storm, 60, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_JANITOR = 150), 1),
// This one is just too fun.
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Gravity Failure", /datum/event/gravity, 65, list(ASSIGNMENT_ENGINEER = 10), 1),
// Temporary power failure, but mitigatead by subgrids
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grid Check", /datum/event/grid_check, 40, list(ASSIGNMENT_SCIENTIST = 10, ASSIGNMENT_ENGINEER = 25), 1),
//Evil grubs that drain station power slightly
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grub Infestation", /datum/event/grub_infestation, -20, list(ASSIGNMENT_SECURITY = 40, ASSIGNMENT_ENGINEER = 40), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Escaped Slimes", /datum/event/escaped_slimes, -40, list(ASSIGNMENT_SCIENTIST = 30, ASSIGNMENT_SECURITY = 20)),
// Pure RP fun, no mechanical effects.
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Ion Storm", /datum/event/ionstorm, -50, list(ASSIGNMENT_AI = 200, ASSIGNMENT_CYBORG = 100, ASSIGNMENT_ENGINEER = 15, ASSIGNMENT_SCIENTIST = 5), 0),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Meteor Shower", /datum/event/meteor_wave, -50, list(ASSIGNMENT_ENGINEER = 45), 1),
//New CHOMPStation event. Mice grow into rats.
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Mutants", /datum/event/mutants, 20, list(ASSIGNMENT_ANY = 15, ASSIGNMENT_SECURITY = 50), 1),
// Opens doors in brig. So just RP fun
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Prison Break", /datum/event/prison_break, -10, list(ASSIGNMENT_SECURITY = 30, ASSIGNMENT_ENGINEER = 20), 1),
// Not bad (dorms are shielded) but inconvenient
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Radiation Storm", /datum/event/radiation_storm, 0, list(ASSIGNMENT_MEDICAL = 35), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Rogue Drones", /datum/event/rogue_drone, -30, list(ASSIGNMENT_SECURITY = 25, ASSIGNMENT_HOS = 35, ASSIGNMENT_WARDEN = 35)),
// Radiation, but only in space.
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Solar Storm", /datum/event/solar_storm, 5, list(ASSIGNMENT_ENGINEER = 40, ASSIGNMENT_SECURITY = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Viral Infection", /datum/event/viral_infection, -60, list(ASSIGNMENT_MEDICAL = 50), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Virology Breach", /datum/event/prison_break/virology, -10, list(ASSIGNMENT_MEDICAL = 30, ASSIGNMENT_ENGINEER = 20), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Wallrot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Wormholes", /datum/event/wormholes, 20, list(ASSIGNMENT_ANY = 5)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Xenobiology Breach", /datum/event/prison_break/xenobiology, -10, list(ASSIGNMENT_SCIENCE = 30, ASSIGNMENT_ENGINEER = 20), 1),
)
add_disabled_events(list(
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Carp School_NoRequirements", /datum/event/carp_migration, 100, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_SECURITY = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Escaped Slimes_NoRequirements", /datum/event/escaped_slimes, 30, list(ASSIGNMENT_SCIENTIST = 40, ASSIGNMENT_SECURITY = 30)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Meteor Shower_NoRequirements", /datum/event/meteor_wave, 30, list(ASSIGNMENT_ENGINEER = 20), 0),
//Moved spider infestation to disabled for now due to CHOMP random event rebalancing.
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation", /datum/event/spider_infestation, -20, list(ASSIGNMENT_SECURITY = 30, ASSIGNMENT_HOS = 20, ASSIGNMENT_WARDEN = 20), 0),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation_NoRequirements", /datum/event/spider_infestation, 100, list(ASSIGNMENT_SECURITY = 40), 0),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Supply Demand", /datum/event/supply_demand, 0, list(ASSIGNMENT_ANY = 5, ASSIGNMENT_SCIENCE = 15, ASSIGNMENT_GARDENER = 10, ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_MEDICAL = 15), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Random Antagonist", /datum/event/random_antag, 3, list(ASSIGNMENT_SECURITY = 1), 1, 0, 5),
))
/datum/event_container/major/New()
available_events = list(
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Nothing", /datum/event/nothing, 900),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Atmos Leak", /datum/event/atmos_leak, 5, list(ASSIGNMENT_ENGINEER = 35), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Blob", /datum/event/blob, -100, list(ASSIGNMENT_SECURITY = 40, ASSIGNMENT_HOS = 10, ASSIGNMENT_WARDEN = 10, ASSIGNMENT_ENGINEER = 5), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Boss", /datum/event/boss, -110, list(ASSIGNMENT_SECURITY = 50, ASSIGNMENT_HOS = 10, ASSIGNMENT_WARDEN = 10), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Carp Migration", /datum/event/carp_migration, -110, list(ASSIGNMENT_SECURITY = 50, ASSIGNMENT_HOS = 10, ASSIGNMENT_WARDEN = 10), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Containment Breach", /datum/event/prison_break/station,0, list(ASSIGNMENT_ANY = 5), 0),
// TFF: Virgo event commented out. Technically meant for Tether maps, not Polaris.
// new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Strike", /datum/event/meteor_strike, 10, list(ASSIGNMENT_ENGINEER = 15), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, -110, list(ASSIGNMENT_ENGINEER = 50), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Metroid Infestation", /datum/event/metroid_infestation, -75, list(ASSIGNMENT_SECURITY = 35, ASSIGNMENT_SCIENCE = 20, ASSIGNMENT_HOS = 10, ASSIGNMENT_WARDEN = 10), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Space Vines", /datum/event/spacevine, 20, list(ASSIGNMENT_ENGINEER = 15), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Spider Infestation", /datum/event/spider_infestation, -45, list(ASSIGNMENT_SECURITY = 30, ASSIGNMENT_HOS = 10, ASSIGNMENT_WARDEN = 10), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Viral Infection", /datum/event/viral_infection, -50, list(ASSIGNMENT_MEDICAL = 25), 1),
)
add_disabled_events(list(
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Blob_NoRequirements", /datum/event/blob, 10, list(ASSIGNMENT_SECURITY = 10, ASSIGNMENT_ENGINEER = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Carp Migration_NoRequirements", /datum/event/carp_migration, 10, list(ASSIGNMENT_SECURITY = 10), 1),
//Moved escaped slimes to disabled for now due to CHOMP random event rebalancing.
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Escaped Slimes", /datum/event/escaped_slimes, -50, list(ASSIGNMENT_SCIENTIST = 30, ASSIGNMENT_SECURITY = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Escaped Slimes_NoRequirements", /datum/event/escaped_slimes, 30, list(ASSIGNMENT_SCIENTIST = 10, ASSIGNMENT_SECURITY = 5)),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave_NoRequirements", /datum/event/meteor_wave, 30, list(ASSIGNMENT_ENGINEER = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Spider Infestation_NoRequirements", /datum/event/spider_infestation, 30, list(ASSIGNMENT_SECURITY = 10), 0),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Supply Demand", /datum/event/supply_demand, 0, list(ASSIGNMENT_ANY = 5, ASSIGNMENT_SCIENCE = 15, ASSIGNMENT_GARDENER = 10, ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_MEDICAL = 15), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Viral Infection_NoRequirements", /datum/event/viral_infection, 50, list(ASSIGNMENT_MEDICAL = 50), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Space Dust", /datum/event/dust, 50, list(ASSIGNMENT_ENGINEER = 30), 0),
))
#undef ASSIGNMENT_ANY
#undef ASSIGNMENT_AI
#undef ASSIGNMENT_CYBORG
#undef ASSIGNMENT_ENGINEER
#undef ASSIGNMENT_GARDENER
#undef ASSIGNMENT_JANITOR
#undef ASSIGNMENT_MEDICAL
#undef ASSIGNMENT_SCIENTIST
#undef ASSIGNMENT_SECURITY
#undef ASSIGNMENT_HOS
#undef ASSIGNMENT_WARDEN
+32
View File
@@ -0,0 +1,32 @@
// This is a parody of Cards Against Humanity (https://en.wikipedia.org/wiki/Cards_Against_Humanity)
// which is licensed under CC BY-NC-SA 2.0, the full text of which can be found at the following URL:
// https://creativecommons.org/licenses/by-nc-sa/2.0/legalcode
/obj/item/weapon/deck/cagse
name = "\improper CAG:SE deck (white)"
desc = "The ever-popular Cards Against The Galaxy: Special Edition word game. Warning: may include traces of broken fourth wall and obscenity. This is the white deck."
icon_state = "cag_white"
var/blanks = 10 //5 extra blank cards than usual to make up for quantity
/obj/item/weapon/deck/cagse/black
name = "\improper CAG:SE deck (black)"
desc = "The ever-popular Cards Against The Galaxy: Special Edition word game. Warning: may include traces of broken fourth wall and obscenity. This is the black deck."
icon_state = "cag_black"
blanks = 0
/obj/item/weapon/deck/cagse/New()
..()
var/datum/playingcard/P
for(var/cardtext in card_text_list)
P = new()
P.name = "[cardtext]"
P.card_icon = "[icon_state]_card"
P.back_icon = "[icon_state]_card_back"
cards += P
if(!blanks)
return
for(var/x=1 to blanks)
P = new()
P.name = "Blank Card"
P.card_icon = "[icon_state]_card_back"
P.back_icon = "[icon_state]_card_back"
+71
View File
@@ -0,0 +1,71 @@
/obj/item/weapon/deck/cagse/black/card_text_list = list(
"Why am I itchy?",
"Today, Security shot ____.",
"The Chaplain this shift is worshiping _____.",
"Cargo ordered a crate full of _____.",
"An ERT was called due to ______.",
"Alert! The Colony Director has armed themselves with _____.",
"Current Laws: ________ is your master.",
"Current Laws: ________ is the enemy.",
"_____ vented the entirety of Cargo.",
"Today, science found an anomaly that made people ____ and ____.",
"There was a rap battle between ____ and ____.",
"Caution, ______ have been detected in collision course with the station.",
"Today's kitchen menu includes _______.",
"What did the mercenaries want when they attacked the station?",
"I think the Colony Director is insane. He just demanded ______ in his office.",
"Fuckin' scientists, they just turned Misc. Research into _______ .",
"What's my fetish?",
"Hello, _______ here with _______",
"No one else was at _______, they wouldn't understand the ______",
"Why am I shivering?",
"What is this world coming to? First, ________, now _______",
"NanoTrasen's labor union decided to use _____ to raise employee morale.",
"The Chemist's drug of choice is ______",
"It is common practice for _______ to ______ on Moghes.",
"Mercurial Colonies are _____.",
"The Skrell are celebrating _____ today.",
"_____ is/are why I'm afraid of the maintenance tunnels.",
"_____ used ____ to create their newest invention, _____!",
"Scientists are not allowed to make Gatling _____.",
"It's not a party until the ____ arrive.",
"No matter how many Tajaran you have, _____ is never acceptable.",
"No, the AI's first law is NOT to serve _____.",
"The robots are not disposal bins for your _____.",
"You can never have too many _____ on shift.",
//Above are the custom cards from VOREStation, below are from CHOMPStation
"I had a confused boner after the Overseer showed me a video of _____.",
"Right after being resleeved by the CMO, I was _____.",
"R&D finally came around and developed _____.",
"After accidentally touching the supermatter crystal, the first thing I saw in the afterlife was _____.",
"In order to appear friendlier towards the crew, security officers started offering complimentary _____.",
"Since nobody ever sets their suit sensors, Medbay has resorted to using _____ as encouragement.",
"New rule at the bar: _____ is now forbidden.",
"The bartender fired two beanbag shells into a patron after they were seen doing _____.",
"After becoming good friends with the Head of Security, they finally let me see their _____ collection.",
"(Pick 2) ATTENTION: The clown is now wanted for possession of _____ and _____.",
"After being caught growing ambrosia, the botanist resorted to recreational _____ to cope.",
"I never expected to find _____ in maintenance.",
"Nobody was heard from again after _____ escaped from xenobiology.",
"_____: Everyone does it.",
"(Pick 2) In exchange for _____, the chef gave me _____.",
"Due to an operating procedure misunderstanding, security officers have been using _____ to process their prisoners.",
"The roboticist keeps building cyborgs to satisfy his _____ fetish, instead of building mechs.",
"Dare dice always ends with _____.",
"The newest rule for dare dice means that the second lowest roller has to wear nothing but _____.",
//Official cards below here
"(Pick 2) Before _____, all we had was_____.",
"(Pick 2) That's right I killed _____. How, you ask? _____.",
"What brought the orgy to a grinding halt?",
"What don't you want to find in your Chinese food?",
"What has been making life difficult at the nudist colony?",
"What's that sound?",
"What's the new fad diet?",
"(Pick 2) Listen, son. If you want to get involved with _____, I wont stop you. Just steer clear of _____.",
"(Pick 2) Having problems with _____? Try _____!",
"(Pick 2) After months of practice with _____, I think Im finally ready for _____.",
"Finally! A service that delivers _____ right to your door."
)
+211
View File
@@ -0,0 +1,211 @@
/obj/item/weapon/deck/cagse/var/list/card_text_list = list(
"Those motherfucking carp",
"Having sex in the maintenance tunnels",
"Space 'Nam",
"Space lesbians",
"The Gardener getting SUPER high",
"The Colony Director thinking they're a badass",
"Being in a cult",
"Racially biased lawsets",
"An Unathi who WON'T STOP FIGHTING",
"Tajaran fetishists",
"Bald thirty-year-olds",
"A Chief Engineer who can't setup the engine",
"Being sucked out into space",
"Officer Beepsky",
"Engineering",
"The grey tide.",
"The Research Director",
"Fucking synths",
"Man-eating purple pod plants",
"Chemical sprayers filled with lube",
"Librarians",
"Squids",
"Cats",
"Lizards",
"Apes",
"Trees",
"Supermatter undergarments",
"Bluespace",
"Five hundred rabid spiders",
"Five hundred rabid diona nymphs",
"Cable ties",
"Rampant vending machines",
"Positronic drink coasters",
"Kitchen utensil anomalies",
"Locked lockers",
"Energy spatulas",
"Flashbang gauntlets",
"Carp",
"Space whales",
"Blu-sharks",
"Fax machines",
"Exquisite Pens",
"Dr. Maxman's male enhancements",
"Gyrating slimes",
"Forehead-mounted laser weaponry",
"Pelvis-mounted laser weaponry",
"Cardboard cutouts",
"An obscene amount of rubber ducks",
"Brain cakes",
"A drone's game of life.",
"Anomaly suits",
"A gardener smoking reishi",
"Military-grade baseball bats",
"Barricading the bar",
"An irritatingly chipper robot",
"Androids hanging out in the bar drinking beer",
"Gear harnesses",
"A seventeen-year-old Colony Director",
"The throbbing erection that the HoS gets at the thought of shooting something",
"Trying to stab someone and hugging them instead",
"Waking up naked in the maintenance tunnels",
"Horrible cloning accidents",
"Licking the supermatter due to a dare",
"A Quartermaster who WON'T STOP ordering guns",
"Teaching a synthetic the Birds and the Bees",
"Unnecessary surgery",
"My addiction to spiders",
"Wetskrell.nt",
"DOCTOR MAXMAN!",
"A group of Skrell getting their squish on",
"Enough soporific to put the entire station down",
"Delicious Vietnamese cuisine",
//Above are the custom cards from VOREStation, below are from CHOMPStation
"Upside-down bat cock vore",
"Wingjobs",
"The HoP feeding someone to Ian after asking for all access",
"Being used as fuel instead of being healed by a medihound",
"Stealing a set of tools",
"Spying on the dorms with hidden cameras",
"Stealing all access",
"Curling up in a belly for hours",
"Being squeezed down a tight throat",
"Being forced down the bartender's cock",
"zip-tying the captain and dragging them into maintenance",
"Shoving micros down any available orifice",
"Being shoved down a K9 cyborg's gullet without consent",
"Tripping in the halls so a medihound eats you",
"Lying on a table until someone eats you",
"forgetting your backup implant",
"Leaving your suit sensors off",
"Turning your suit sensors to tracking",
"Giving the clown the spare ID",
"Happily letting yourself be digested just because someone was hungry",
"Waking up inside a pair of giant nuts",
"A shock collar that never turns off",
"A size gun without a limiter",
"Cock vore",
"A slimy tongue",
"Being digested into spunk under the bar counter",
"Maintenance trash pile loot",
"voring all your friends",
"Digesting all your friends",
"Getting fucked from behind right in the bar",
"Actually using a dorm room",
"Swallowing enough cum to fill a pool",
"Giving away the frequency for your shock collar",
"Ten foot tall sergals",
"Knotted dog cock",
"Modular, synthetic, prehensile cocks",
"Tail maws",
"Pants pockets",
"Not wearing anything",
"Using a nudity permit just because you want to be naked",
"Nudity",
"Autofellatio",
"Clit dicks",
"Teshari terrorists",
"Being used as a tap at the bar",
"Being suffocated by a tight gut",
"Slurping noises",
"Listening to someone slowly digest",
"Not asking if your prey is backup implanted",
"A person-sized load of cum",
"Horse cocks",
"A digested ID card",
"Canine pussy",
"Horse pussy",
"All of medbay being eaten",
"Getting space aids",
"Being consumed by a deathclaw",
"A traitor consuming every last crew member",
"flooding the hallways with wolf cum",
"The Skrell doing Skrell things",
"Slimy xenomorph ovipositors",
"Lusty xenomorph maids",
"Steamy bareback sex",
"Anal beads",
"Being kidnapped after someone slips neurotoxin into your drink",
"A woman who surprisingly doesnt have a penis",
"A man who surprisingly doesnt have a penis",
"Literally xenomorphs",
"A blowjob",
"Actually using a condom",
"Metroids again",
"Driving cargo tugs around like race cars",
"Using your fat friend to try and start the singularity engine",
"A latex maid costume",
"A realistic xenomorph costume",
"A seductive bee costume",
"A cake hat",
"A synthetic strapon with ten thousand different shapes",
"A condom",
"High heels",
"Thigh high socks",
"A swimsuit consisting of just a thong",
"A cone hat",
"Crawling into the mouth of a sleeping crewmember",
"A full toolbelt",
"A dildo",
"fuzzy cuffs",
"BDSM",
"Being constricted by a giant serpent tail",
"Bulges",
"A bartender",
"An EMT",
"A clown",
"A person AI",
"The station AI",
"Anatomically correct",
"Toe beans",
"Paws",
"Slow digestion",
//And everything beyond this are cards from the original CAH that fit well enough with the other cards
"A 55-gallon drum of lube.",
"A cooler full of organs.",
"A gentle caress of the inner thigh.",
"A homoerotic volleyball montage.",
"A hot mess.",
"A mating display.",
"A tiny horse.",
"A zesty breakfast burrito.",
"An erection that lasts more than four hours.",
"Anal beads.",
"Balls.",
"Basic human decency.",
"Beating your wives.",
"Being awesome at sex.",
"Bitches.",
"Centaurs.",
"Civilian casualties.",
"Daddy issues.",
"Date rape.",
"Exactly what you'd expect.",
"Getting so angry that you pop a boner.",
"Gloryholes.",
"Good grammar.",
"Intimacy problems.",
"Just the tip.",
"Lactation.",
"My hot cousin.",
"Natural male enhancement.",
"My vagina.",
"Panda sex.",
"Sexting.",
"Shaft.",
"Tongue.",
"A cop who is also a dog.",
"A vagina that leads to another dimension.",
"Blowing some dudes in an alley."
)
@@ -1,166 +1,175 @@
#define NEIGHBOR_REFRESH_TIME 100
/obj/effect/plant/proc/get_cardinal_neighbors()
var/list/cardinal_neighbors = list()
for(var/check_dir in cardinal)
var/turf/simulated/T = get_step(get_turf(src), check_dir)
if(istype(T))
cardinal_neighbors |= T
return cardinal_neighbors
/obj/effect/plant/proc/update_neighbors()
// Update our list of valid neighboring turfs.
neighbors = list()
for(var/turf/simulated/floor in get_cardinal_neighbors())
if(get_dist(parent, floor) > spread_distance)
continue
var/blocked = 0
for(var/obj/effect/plant/other in floor.contents)
if(other.seed == src.seed)
blocked = 1
break
if(blocked)
continue
if(floor.density)
if(!isnull(seed.chems["pacid"]))
spawn(rand(5,25)) floor.ex_act(3)
continue
if(!Adjacent(floor) || !floor.Enter(src))
continue
neighbors |= floor
if(neighbors.len)
plant_controller.add_plant(src) //if we have neighbours again, start processing
// Update all of our friends.
var/turf/T = get_turf(src)
for(var/obj/effect/plant/neighbor in range(1,src))
if(neighbor.seed == src.seed)
neighbor.neighbors -= T
/obj/effect/plant/process()
// Something is very wrong, kill ourselves.
if(!seed)
die_off()
return 0
for(var/obj/effect/effect/smoke/chem/smoke in view(1, src))
if(smoke.reagents.has_reagent("plantbgone"))
die_off()
return
// Handle life.
var/turf/simulated/T = get_turf(src)
if(istype(T))
health -= seed.handle_environment(T,T.return_air(),null,1)
if(health < max_health)
health += rand(3,5)
refresh_icon()
if(health > max_health)
health = max_health
else if(health == max_health && !plant)
plant = new(T,seed)
plant.dir = src.dir
plant.transform = src.transform
plant.age = seed.get_trait(TRAIT_MATURATION)-1
plant.update_icon()
if(growth_type==0) //Vines do not become invisible.
invisibility = INVISIBILITY_MAXIMUM
else
plant.layer = layer + 0.1
if(has_buckled_mobs())
for(var/A in buckled_mobs)
var/mob/living/L = A
seed.do_sting(L,src)
if(seed.get_trait(TRAIT_CARNIVOROUS))
seed.do_thorns(L,src)
if(world.time >= last_tick+NEIGHBOR_REFRESH_TIME)
last_tick = world.time
update_neighbors()
if(sampled)
//Should be between 2-7 for given the default range of values for TRAIT_PRODUCTION
var/chance = max(1, round(15/seed.get_trait(TRAIT_PRODUCTION)))
if(prob(chance))
sampled = 0
if(is_mature() && !has_buckled_mobs())
for(var/turf/neighbor in neighbors)
for(var/mob/living/M in neighbor)
if(seed.get_trait(TRAIT_SPREAD) >= 2 && (M.lying || prob(round(seed.get_trait(TRAIT_POTENCY)))))
entangle(M)
if(is_mature() && neighbors.len && prob(spread_chance))
//spread to 1-3 adjacent turfs depending on yield trait.
var/max_spread = between(1, round(seed.get_trait(TRAIT_YIELD)*3/14), 3)
for(var/i in 1 to max_spread)
if(prob(spread_chance))
sleep(rand(3,5))
if(!neighbors.len)
break
spread_to(pick(neighbors))
// We shouldn't have spawned if the controller doesn't exist.
check_health()
if(has_buckled_mobs() || neighbors.len)
plant_controller.add_plant(src)
//spreading vines aren't created on their final turf.
//Instead, they are created at their parent and then move to their destination.
/obj/effect/plant/proc/spread_to(turf/target_turf)
var/obj/effect/plant/child = new(get_turf(src),seed,parent)
spawn(1) // This should do a little bit of animation.
if(QDELETED(child))
return
//move out to the destination
child.anchored = 0
step_to(child, target_turf)
child.anchored = 1
child.update_icon()
//see if anything is there
for(var/thing in child.loc)
if(thing != child && istype(thing, /obj/effect/plant))
var/obj/effect/plant/other = thing
if(other.seed != child.seed)
other.vine_overrun(child.seed, src) //vine fight
qdel(child)
return
if(istype(thing, /obj/effect/dead_plant))
qdel(thing)
qdel(child)
return
if(isliving(thing) && (seed.get_trait(TRAIT_CARNIVOROUS) || (seed.get_trait(TRAIT_SPREAD) >= 2 && prob(round(seed.get_trait(TRAIT_POTENCY))))))
entangle(thing)
qdel(child)
return
// Update neighboring squares.
for(var/obj/effect/plant/neighbor in range(1, child.loc)) //can use the actual final child loc now
if(child.seed == neighbor.seed) //neighbors of different seeds will continue to try to overrun each other
neighbor.neighbors -= target_turf
child.finish_spreading()
/obj/effect/plant/proc/die_off()
// Kill off our plant.
if(plant) plant.die()
// This turf is clear now, let our buddies know.
for(var/turf/simulated/check_turf in get_cardinal_neighbors())
if(!istype(check_turf))
continue
for(var/obj/effect/plant/neighbor in check_turf.contents)
neighbor.neighbors |= check_turf
plant_controller.add_plant(neighbor)
spawn(1) if(src) qdel(src)
#define NEIGHBOR_REFRESH_TIME 100
/obj/effect/plant/proc/get_cardinal_neighbors()
var/list/cardinal_neighbors = list()
for(var/check_dir in cardinal)
var/turf/simulated/T = get_step(get_turf(src), check_dir)
if(istype(T))
cardinal_neighbors |= T
return cardinal_neighbors
/obj/effect/plant/proc/update_neighbors()
// Update our list of valid neighboring turfs.
neighbors = list()
for(var/turf/simulated/floor in get_cardinal_neighbors())
if(get_dist(parent, floor) > spread_distance)
continue
var/blocked = 0
for(var/obj/effect/plant/other in floor.contents)
if(other.seed == src.seed)
blocked = 1
break
if(blocked)
continue
if(floor.density)
if(!isnull(seed.chems["pacid"]))
spawn(rand(5,25)) floor.ex_act(3)
continue
if(!Adjacent(floor) || !floor.Enter(src))
continue
neighbors |= floor
if(neighbors.len)
plant_controller.add_plant(src) //if we have neighbours again, start processing
// Update all of our friends.
var/turf/T = get_turf(src)
for(var/obj/effect/plant/neighbor in range(1,src))
if(neighbor.seed == src.seed)
neighbor.neighbors -= T
/obj/effect/plant/process()
// Something is very wrong, kill ourselves.
if(!seed)
die_off()
return 0
for(var/obj/effect/effect/smoke/chem/smoke in view(1, src))
if(smoke.reagents.has_reagent("plantbgone"))
die_off()
return
// Handle life.
var/turf/simulated/T = get_turf(src)
if(istype(T))
health -= seed.handle_environment(T,T.return_air(),null,1)
if(health < max_health)
health += rand(3,5)
refresh_icon()
if(health > max_health)
health = max_health
else if(health == max_health && !plant)
plant = new(T,seed)
plant.dir = src.dir
plant.transform = src.transform
plant.age = seed.get_trait(TRAIT_MATURATION)-1
plant.update_icon()
if(growth_type==0) //Vines do not become invisible.
invisibility = INVISIBILITY_MAXIMUM
else
plant.layer = layer + 0.1
if(has_buckled_mobs())
for(var/A in buckled_mobs)
var/mob/living/L = A
seed.do_sting(L,src)
if(seed.get_trait(TRAIT_CARNIVOROUS))
seed.do_thorns(L,src)
if(world.time >= last_tick+NEIGHBOR_REFRESH_TIME)
last_tick = world.time
update_neighbors()
if(sampled)
//Should be between 2-7 for given the default range of values for TRAIT_PRODUCTION
var/chance = max(1, round(15/seed.get_trait(TRAIT_PRODUCTION)))
if(prob(chance))
sampled = 0
if(is_mature() && !has_buckled_mobs())
for(var/turf/neighbor in neighbors)
for(var/mob/living/M in neighbor)
if(seed.get_trait(TRAIT_SPREAD) >= 2 && (M.lying || prob(round(seed.get_trait(TRAIT_POTENCY)))))
entangle(M)
if(is_mature() && neighbors.len && prob(spread_chance))
//spread to 1-3 adjacent turfs depending on yield trait.
var/max_spread = between(1, round(seed.get_trait(TRAIT_YIELD)*3/14), 3)
for(var/i in 1 to max_spread)
if(prob(spread_chance))
sleep(rand(3,5))
if(!neighbors.len)
break
spread_to(pick(neighbors))
// We shouldn't have spawned if the controller doesn't exist.
check_health()
if(has_buckled_mobs() || neighbors.len)
plant_controller.add_plant(src)
//spreading vines aren't created on their final turf.
//Instead, they are created at their parent and then move to their destination.
/obj/effect/plant/proc/spread_to(turf/target_turf)
var/obj/effect/plant/child = new(get_turf(src),seed,parent)
spawn(1) // This should do a little bit of animation.
if(QDELETED(child))
return
//move out to the destination
child.anchored = 0
step_to(child, target_turf)
child.anchored = 1
child.update_icon()
if((seed.get_trait(TRAIT_POTENCY)) >= 50 && (seed.get_trait(TRAIT_CARNIVOROUS)) && prob(5))
var/spread_mobspawn = rand(0,2)
switch(spread_mobspawn)
if(0) new /mob/living/simple_animal/hostile/piranhaplant(src.loc)
if(1) new /mob/living/simple_animal/hostile/piranhaplant/spitter(src.loc)
if(2) new /mob/living/simple_animal/hostile/piranhaplant/pitcher(src.loc)
//see if anything is there
for(var/thing in child.loc)
if(thing != child && istype(thing, /obj/effect/plant))
var/obj/effect/plant/other = thing
if(other.seed != child.seed)
other.vine_overrun(child.seed, src) //vine fight
qdel(child)
return
if(istype(thing, /obj/effect/dead_plant))
qdel(thing)
qdel(child)
return
if(isliving(thing) && (seed.get_trait(TRAIT_CARNIVOROUS) || (seed.get_trait(TRAIT_SPREAD) >= 2 && prob(round(seed.get_trait(TRAIT_POTENCY))))))
entangle(thing)
qdel(child)
return
// Update neighboring squares.
for(var/obj/effect/plant/neighbor in range(1, child.loc)) //can use the actual final child loc now
if(child.seed == neighbor.seed) //neighbors of different seeds will continue to try to overrun each other
neighbor.neighbors -= target_turf
child.finish_spreading()
/obj/effect/plant/proc/die_off()
// Kill off our plant.
if(plant) plant.die()
// This turf is clear now, let our buddies know.
for(var/turf/simulated/check_turf in get_cardinal_neighbors())
if(!istype(check_turf))
continue
for(var/obj/effect/plant/neighbor in check_turf.contents)
neighbor.neighbors |= check_turf
plant_controller.add_plant(neighbor)
spawn(1) if(src) qdel(src)
#undef NEIGHBOR_REFRESH_TIME
@@ -1,100 +1,106 @@
/obj/effect/plant/HasProximity(var/atom/movable/AM)
if(!is_mature() || seed.get_trait(TRAIT_SPREAD) != 2)
return
var/mob/living/M = AM
if(!istype(M))
return
if(!has_buckled_mobs() && !M.buckled && !M.anchored && (issmall(M) || prob(round(seed.get_trait(TRAIT_POTENCY)/3))))
//wait a tick for the Entered() proc that called HasProximity() to finish (and thus the moving animation),
//so we don't appear to teleport from two tiles away when moving into a turf adjacent to vines.
spawn(1)
entangle(M)
/obj/effect/plant/attack_hand(var/mob/user)
manual_unbuckle(user)
/obj/effect/plant/attack_generic(var/mob/user)
manual_unbuckle(user)
/obj/effect/plant/Crossed(atom/movable/O)
if(isliving(O))
trodden_on(O)
/obj/effect/plant/proc/trodden_on(var/mob/living/victim)
if(!is_mature())
return
var/mob/living/carbon/human/H = victim
if(prob(round(seed.get_trait(TRAIT_POTENCY)/3)))
entangle(victim)
if(istype(H) && H.shoes)
return
seed.do_thorns(victim,src)
seed.do_sting(victim,src,pick("r_foot","l_foot","r_leg","l_leg"))
/obj/effect/plant/proc/unbuckle()
if(has_buckled_mobs())
for(var/A in buckled_mobs)
var/mob/living/L = A
if(L.buckled == src)
L.buckled = null
L.anchored = initial(L.anchored)
L.update_canmove()
buckled_mobs = list()
return
/obj/effect/plant/proc/manual_unbuckle(mob/user as mob)
if(has_buckled_mobs())
var/chance = 20
if(seed)
chance = round(100/(20*seed.get_trait(TRAIT_POTENCY)/100))
if(prob(chance))
for(var/A in buckled_mobs)
var/mob/living/L = A
if(!(user in buckled_mobs))
L.visible_message(\
"<span class='notice'>\The [user] frees \the [L] from \the [src].</span>",\
"<span class='notice'>\The [user] frees you from \the [src].</span>",\
"<span class='warning'>You hear shredding and ripping.</span>")
else
L.visible_message(\
"<span class='notice'>\The [L] struggles free of \the [src].</span>",\
"<span class='notice'>You untangle \the [src] from around yourself.</span>",\
"<span class='warning'>You hear shredding and ripping.</span>")
unbuckle()
else
user.setClickCooldown(user.get_attack_speed())
health -= rand(1,5)
var/text = pick("rip","tear","pull", "bite", "tug")
user.visible_message(\
"<span class='warning'>\The [user] [text]s at \the [src].</span>",\
"<span class='warning'>You [text] at \the [src].</span>",\
"<span class='warning'>You hear shredding and ripping.</span>")
check_health()
return
/obj/effect/plant/proc/entangle(var/mob/living/victim)
if(has_buckled_mobs())
return
if(victim.buckled || victim.anchored)
return
//grabbing people
if(!victim.anchored && Adjacent(victim) && victim.loc != src.loc)
var/can_grab = 1
if(istype(victim, /mob/living/carbon/human))
var/mob/living/carbon/human/H = victim
if(istype(H.shoes, /obj/item/clothing/shoes/magboots) && (H.shoes.item_flags & NOSLIP))
can_grab = 0
if(can_grab)
src.visible_message("<span class='danger'>Tendrils lash out from \the [src] and drag \the [victim] in!</span>")
victim.forceMove(src.loc)
buckle_mob(victim)
victim.set_dir(pick(cardinal))
victim << "<span class='danger'>Tendrils [pick("wind", "tangle", "tighten")] around you!</span>"
victim.Weaken(0.5)
seed.do_thorns(victim,src)
/obj/effect/plant/HasProximity(var/atom/movable/AM)
if(!is_mature() || seed.get_trait(TRAIT_SPREAD) != 2)
return
var/mob/living/M = AM
if(!istype(M))
return
if(!has_buckled_mobs() && !M.buckled && !M.anchored && (issmall(M) || prob(round(seed.get_trait(TRAIT_POTENCY)/3))))
//wait a tick for the Entered() proc that called HasProximity() to finish (and thus the moving animation),
//so we don't appear to teleport from two tiles away when moving into a turf adjacent to vines.
if(M.entangle_immunity == 1)
return
spawn(1)
entangle(M)
/obj/effect/plant/attack_hand(var/mob/user)
manual_unbuckle(user)
/obj/effect/plant/attack_generic(var/mob/user)
manual_unbuckle(user)
/obj/effect/plant/Crossed(atom/movable/O)
if(isliving(O))
trodden_on(O)
/obj/effect/plant/proc/trodden_on(var/mob/living/victim)
if(!is_mature())
return
var/mob/living/carbon/human/H = victim
if(H.entangle_immunity == 1)
return
if(prob(round(seed.get_trait(TRAIT_POTENCY)/3)))
entangle(victim)
if(istype(H) && H.shoes)
return
seed.do_thorns(victim,src)
seed.do_sting(victim,src,pick("r_foot","l_foot","r_leg","l_leg"))
/obj/effect/plant/proc/unbuckle()
if(has_buckled_mobs())
for(var/A in buckled_mobs)
var/mob/living/L = A
if(L.buckled == src)
L.buckled = null
L.anchored = initial(L.anchored)
L.update_canmove()
buckled_mobs = list()
return
/obj/effect/plant/proc/manual_unbuckle(mob/user as mob)
if(has_buckled_mobs())
var/chance = 20
if(seed)
chance = round(100/(20*seed.get_trait(TRAIT_POTENCY)/100))
if(prob(chance))
for(var/A in buckled_mobs)
var/mob/living/L = A
if(!(user in buckled_mobs))
L.visible_message(\
"<span class='notice'>\The [user] frees \the [L] from \the [src].</span>",\
"<span class='notice'>\The [user] frees you from \the [src].</span>",\
"<span class='warning'>You hear shredding and ripping.</span>")
else
L.visible_message(\
"<span class='notice'>\The [L] struggles free of \the [src].</span>",\
"<span class='notice'>You untangle \the [src] from around yourself.</span>",\
"<span class='warning'>You hear shredding and ripping.</span>")
unbuckle()
else
user.setClickCooldown(user.get_attack_speed())
health -= rand(1,5)
var/text = pick("rip","tear","pull", "bite", "tug")
user.visible_message(\
"<span class='warning'>\The [user] [text]s at \the [src].</span>",\
"<span class='warning'>You [text] at \the [src].</span>",\
"<span class='warning'>You hear shredding and ripping.</span>")
check_health()
return
/obj/effect/plant/proc/entangle(var/mob/living/victim)
if(has_buckled_mobs())
return
if(victim.buckled || victim.anchored)
return
//grabbing people
if(!victim.anchored && Adjacent(victim) && victim.loc != src.loc)
var/can_grab = 1
if(istype(victim, /mob/living/carbon/human))
var/mob/living/carbon/human/H = victim
if(H.entangle_immunity == 1)
return
if(istype(H.shoes, /obj/item/clothing/shoes/magboots) && (H.shoes.item_flags & NOSLIP))
can_grab = 0
if(can_grab)
src.visible_message("<span class='danger'>Tendrils lash out from \the [src] and drag \the [victim] in!</span>")
victim.forceMove(src.loc)
buckle_mob(victim)
victim.set_dir(pick(cardinal))
victim << "<span class='danger'>Tendrils [pick("wind", "tangle", "tighten")] around you!</span>"
victim.Weaken(0.5)
seed.do_thorns(victim,src)
@@ -84,7 +84,7 @@
var/clr
if(seed.get_trait(TRAIT_BIOLUM_COLOUR))
clr = seed.get_trait(TRAIT_BIOLUM_COLOUR)
set_light(round(seed.get_trait(TRAIT_POTENCY)/10), l_color = clr)
set_light(round(seed.get_trait(TRAIT_POTENCY)/5), l_color = clr)
return
set_light(0)
+4 -1
View File
@@ -9,15 +9,17 @@
var/artist // Song's creator
var/duration // Song length in deciseconds
var/secret // Show up in regular playlist or secret playlist?
var/casino // Music for casino jukebox
var/lobby // Be one of the choices for lobby music?
/datum/track/New(var/url, var/title, var/duration, var/artist = "", var/secret = 0, var/lobby = 0)
/datum/track/New(var/url, var/title, var/duration, var/artist = "", var/secret = 0, var/lobby = 0, var/casino = 0)
src.url = url
src.title = title
src.artist = artist
src.duration = duration
src.secret = secret
src.lobby = lobby
src.casino = casino
/datum/track/proc/display()
var str = "\"[title]\""
@@ -58,6 +60,7 @@ var/global/list/all_lobby_tracks = list()
if(istext(entry["artist"]))
T.artist = entry["artist"]
T.secret = entry["secret"] ? 1 : 0
T.casino = entry["casino"] ? 1 : 0
T.lobby = entry["lobby"] ? 1 : 0
all_jukebox_tracks += T
if(T.lobby)
@@ -16,9 +16,9 @@
ai_inactive = TRUE //Always off
show_stat_health = FALSE //We will do it ourselves
response_help = "pats the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
response_help = "pats"
response_disarm = "gently pushes aside"
response_harm = "hits"
harm_intent_damage = 2
melee_damage_lower = 10
@@ -241,7 +241,7 @@
//Message
blob.visible_message("<b>[src.name]</b> collapses into a gooey blob!")
//Duration of the to_puddle iconstate that the blob starts with
sleep(13)
blob.update_icon() //Will remove the collapse anim
@@ -268,7 +268,7 @@
if(pulledby)
pulledby.stop_pulling()
stop_pulling()
//Stop healing if we are
if(blob.healing)
blob.healing.expire()
@@ -278,7 +278,7 @@
//Message
blob.visible_message("<b>[src.name]</b> reshapes into a humanoid appearance!")
//Duration of above animation
sleep(8)
@@ -303,7 +303,7 @@
var/obj/belly/B = belly
B.forceMove(src)
B.owner = src
//Get rid of friend blob
qdel(blob)
File diff suppressed because it is too large Load Diff
+9 -5
View File
@@ -33,7 +33,10 @@
"Fox" = "fox",
"Parrot" = "parrot",
"Rabbit" = "rabbit",
"Bear" = "bear" //VOREStation Edit
"Bear" = "bear", //VOREStation Edit
"Raccoon" = "raccoon", //Chompstation Edit
"Rat" = "rat", //Chompstation Edit
"Panther" = "panther" //Chompstation Edit
)
var/global/list/possible_say_verbs = list(
@@ -42,7 +45,8 @@
"Beep" = list("beeps","beeps loudly","boops"),
"Chirp" = list("chirps","chirrups","cheeps"),
"Feline" = list("purrs","yowls","meows"),
"Canine" = list("yaps","barks","woofs")
"Canine" = list("yaps","barks","woofs"),
"Rodent" = list("squeaks", "SQUEAKS", "sqiks")//Chompstation Edit
)
var/obj/item/weapon/pai_cable/cable // The cable we produce and use when door or camera jacking
@@ -315,7 +319,7 @@
return
close_up()
/*CHOMPstation edit | redefined in pai_vr.dm
/mob/living/silicon/pai/proc/choose_chassis()
set category = "pAI Commands"
set name = "Choose Chassis"
@@ -328,11 +332,11 @@
if(!choice) return
icon_state = possible_chassis[choice]
finalized = alert("Look at your sprite. Is this what you wish to use?",,"No","Yes")
finalized = alert("Look at your sprite. Is this what you wish to use?",,"No","Yes")//CHOMPStation edit
chassis = possible_chassis[choice]
verbs |= /mob/living/proc/hide
*/
/mob/living/silicon/pai/proc/choose_verbs()
set category = "pAI Commands"
set name = "Choose Speech Verbs"
@@ -1,6 +1,10 @@
/mob/living/silicon/pai
var/people_eaten = 0
icon = 'icons/mob/pai_vr.dmi'
var/global/list/wide_chassis = list(
"rat",
"panther"
)
/mob/living/silicon/pai/proc/pai_nom(var/mob/living/T in oview(1))
set name = "pAI Nom"
@@ -31,6 +35,13 @@
else if(people_eaten && resting)
icon_state = "[chassis]_rest_full"
if(chassis in wide_chassis)
icon = 'icons/mob/pai_vr64x64.dmi'
pixel_x = -16
else
icon = 'icons/mob/pai_vr.dmi'
pixel_x = 0
/mob/living/silicon/pai/update_icons() //And other functions cause this to occur, such as digesting someone.
..()
update_fullness_pai()
@@ -42,3 +53,21 @@
icon_state = "[chassis]_full"
else if(people_eaten && resting)
icon_state = "[chassis]_rest_full"
if(chassis in wide_chassis)
icon = 'icons/mob/pai_vr64x64.dmi'
pixel_x = -16
else
icon = 'icons/mob/pai_vr.dmi'
pixel_x = 0
//proc override to avoid pAI players being invisible while the chassis selection window is open
/mob/living/silicon/pai/proc/choose_chassis()
set category = "pAI Commands"
set name = "Choose Chassis"
var/choice
choice = input(usr,"What would you like to use for your mobile chassis icon?") as null|anything in possible_chassis
if(!choice) return
chassis = possible_chassis[choice]
verbs |= /mob/living/proc/hide
update_icon()
@@ -421,3 +421,27 @@
T.apply_damage(20, HALLOSS,, armor_block, armor_soak)
if(prob(33))
T.apply_effect(3, WEAKEN, armor_block)
/mob/living/silicon/robot/proc/reskin_booze()
set name = "Change Drink Color"
set category = "Robot Commands"
set desc = "Choose the color of drink displayed inside you."
var/mob/M = usr
var/list/options = list()
options["Beer"] = "Beer Buddy"
options["Curacao"] = "Brilliant Blue"
options["Coffee"] = "Caffine Dispenser"
options["Space Mountain Wind"] = "Gamer Juice Maker"
options["Whiskey Soda"] = "Liqour Licker"
options["Grape Soda"] = "The Grapist"
options["Demon's Blood"] = "Vampire's Aid"
options["Slav Vodka"] = "Vodka Komrade"
var/choice = input(M,"Choose your drink!") in options
if(src && choice && !M.stat && in_range(M,src))
icontype = options[choice]
var/active_sound = 'sound/effects/bubbles.ogg'
playsound(src.loc, "[active_sound]", 100, 0, 4)
M << "Your Tank now displays [choice]. Drink up and enjoy!"
updateicon()
return 1
@@ -683,4 +683,34 @@
/obj/item/device/dogborg/sleeper/medical
name = "Borg Mounted Sleeper"
desc = "A stretchy stomach for a vore enabled medical borg, it can hold crew for healing or as emergency power."
icon_state = "belly-medical"
icon_state = "belly-medical"
/obj/item/device/dogborg/sleeper/compactor/brewer //Boozehound gut.
name = "Brew Belly"
desc = "A mounted drunk tank unit with fuel processor."
icon_state = "brewer"
injection_chems = list("vodka","beer","gin") //Injected alcohol is 3 times as strong
max_item_count = 1
/obj/item/device/dogborg/sleeper/compactor/brewer/inject_chem(mob/user, chem)
if(patient && patient.reagents)
if(chem in injection_chems + "inaprovaline")
if(hound.cell.charge < 200) //This is so borgs don't kill themselves with it.
to_chat(hound, "<span class='notice'>You don't have enough power to synthesize fluids.</span>")
return
else if(patient.reagents.get_reagent_amount(chem) + 10 >= 50) //Preventing people from accidentally killing themselves by trying to inject too many chemicals!
to_chat(hound, "<span class='notice'>Your stomach is currently too full of fluids to secrete more fluids of this kind.</span>")
else if(patient.reagents.get_reagent_amount(chem) + 10 <= 50) //No overdoses for you
patient.reagents.add_reagent(chem, inject_amount)
drain(100) //-100 charge per injection
var/units = round(patient.reagents.get_reagent_amount(chem))
to_chat(hound, "<span class='notice'>Injecting [units] unit\s of [chemical_reagents_list[chem]] into occupant.</span>") //If they were immersed, the reagents wouldn't leave with them.
// PLACEHOLDER SERVICE BORG BELLY
/obj/item/device/dogborg/sleeper/servborg
name = "Gourmet Gut"
desc = "An underslung microwave, with optional fuel processor."
icon_state = "decompiler"
max_item_count = 10
injection_chems = null
@@ -43,6 +43,8 @@
robot_modules["Janihound"] = /obj/item/weapon/robot_module/robot/scrubpup
robot_modules["Sci-borg"] = /obj/item/weapon/robot_module/robot/science
robot_modules["Pupdozer"] = /obj/item/weapon/robot_module/robot/engiedog
robot_modules["BoozeHound"] = /obj/item/weapon/robot_module/robot/booze
robot_modules["Service-borg"] = /obj/item/weapon/robot_module/robot/servborg
robot_modules["Vore Services"] = /obj/item/weapon/robot_module/robot/servore//edit chompers
robot_modules["Medivore"] = /obj/item/weapon/robot_module/robot/medical/vore
return 1
@@ -445,6 +447,105 @@
R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill
..()
/obj/item/weapon/robot_module/robot/booze
name = "BoozeHound robot module"
channels = list("Service" = 1)
languages = list(
LANGUAGE_SOL_COMMON = 1,
LANGUAGE_UNATHI = 1,
LANGUAGE_SIIK = 1,
LANGUAGE_AKHANI = 1,
LANGUAGE_SKRELLIAN = 1,
LANGUAGE_SKRELLIANFAR = 0,
LANGUAGE_ROOTLOCAL = 0,
LANGUAGE_TRADEBAND = 1,
LANGUAGE_GUTTER = 0,
LANGUAGE_SCHECHI = 1,
LANGUAGE_EAL = 1,
LANGUAGE_TERMINUS = 1,
LANGUAGE_SIGN = 0
)
/obj/item/weapon/robot_module/robot/booze
sprites = list(
"Beer Buddy" = "boozeborg",
"Brilliant Blue" = "boozeborg(blue)",
"Caffine Dispenser" = "boozeborg(coffee)",
"Gamer Juice Maker" = "boozeborg(green)",
"Liqour Licker" = "boozeborg(orange)",
"The Grapist" = "boozeborg(purple)",
"Vampire's Aid" = "boozeborg(red)",
"Vodka Komrade" = "boozeborg(vodka)"
)
/obj/item/weapon/robot_module/robot/booze/New(var/mob/living/silicon/robot/R)
src.modules += new /obj/item/weapon/gripper/service(src)
//src.modules += new /obj/item/weapon/reagent_containers/glass/bucket(src)
//src.modules += new /obj/item/weapon/material/minihoe(src)
//src.modules += new /obj/item/device/analyzer/plant_analyzer(src)
//src.modules += new /obj/item/weapon/storage/bag/plants(src)
//src.modules += new /obj/item/weapon/robot_harvester(src)
src.modules += new /obj/item/weapon/material/knife(src)
src.modules += new /obj/item/weapon/material/kitchen/rollingpin(src)
src.modules += new /obj/item/device/multitool(src) //to freeze trays
src.modules += new /obj/item/weapon/dogborg/jaws/small(src)
src.modules += new /obj/item/device/dogborg/boop_module(src)
src.modules += new /obj/item/device/dogborg/sleeper/compactor/brewer(src)
src.modules += new /obj/item/weapon/reagent_containers/glass/beaker(src)//For holding the ALCOHOL
src.emag = new /obj/item/weapon/dogborg/pounce(src)
R.verbs += /mob/living/silicon/robot/proc/reskin_booze
var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src)
M.stored_matter = 30
src.modules += M
src.modules += new /obj/item/weapon/reagent_containers/dropper/industrial(src)
var/obj/item/weapon/flame/lighter/zippo/L = new /obj/item/weapon/flame/lighter/zippo(src)
L.lit = 1
src.modules += L
var/datum/matter_synth/water = new /datum/matter_synth()
water.name = "Water reserves"
water.recharge_rate = 0.1 // Recharging water for plants - hehe drooly borg
water.max_energy = 1000
water.energy = 0
R.water_res = water
synths += water
var/obj/item/device/dogborg/tongue/T = new /obj/item/device/dogborg/tongue(src)
T.water = water
src.modules += T
src.modules += new /obj/item/weapon/tray/robotray(src)
src.modules += new /obj/item/weapon/reagent_containers/borghypo/service/booze(src)
src.emag = new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer(src)
var/datum/reagents/N = new/datum/reagents(50)
src.emag.reagents = N
N.my_atom = src.emag
N.add_reagent("beer2", 50)
src.emag.name = "Mickey Finn's Special Brew"
R.can_buckle = 1
R.icon = 'icons/mob/widerobot_colors_vr.dmi'
R.hands.icon = 'icons/mob/screen1_robot_vr.dmi'
R.ui_style_vr = TRUE
R.pixel_x = -16
R.old_x = -16
R.default_pixel_x = -16
R.dogborg = TRUE
R.wideborg = TRUE
R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill
..()
/obj/item/weapon/robot_module/robot/booze/respawn_consumable(var/mob/living/silicon/robot/R, var/amount)
var/obj/item/weapon/reagent_containers/food/condiment/enzyme/E = locate() in src.modules
E.reagents.add_reagent("enzyme", 2 * amount)
if(src.emag)
var/obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer/B = src.emag
B.reagents.add_reagent("beer2", 2 * amount)
/obj/item/weapon/robot_module/robot/engiedog
name = "Construction Hound module"
can_buckle = 1
@@ -569,6 +670,83 @@
R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill
..()
// SKYVAAL ADDED SERVICE BORG CODE
/obj/item/weapon/robot_module/robot/servborg
name = "Service Hound Module"
can_buckle = 1
sprites = list(
"Chef-borg" = "servborg",
"Booze-borg" = "boozeborg"
)
channels = list("Service" = 1)
can_be_pushed = 0
/obj/item/weapon/robot_module/robot/servborg/New(var/mob/living/silicon/robot/R)
var/datum/matter_synth/water = new /datum/matter_synth()
water.name = "Water reserves"
water.recharge_rate = 0.1 // Recharging water for plants - hehe drooly borg
water.max_energy = 1000
water.energy = 0
R.water_res = water
synths += water
// Dogborg Standard
src.modules += new /obj/item/weapon/dogborg/jaws/small(src)
src.modules += new /obj/item/device/dogborg/boop_module(src)
var/obj/item/device/dogborg/tongue/T = new /obj/item/device/dogborg/tongue(src)
T.water = water
src.modules += T
// PLACEHOLDER AS 'BRIGBELLY' UNTIL MICROWAVE BELLY SORTED
var/obj/item/device/dogborg/sleeper/servborg/B = new /obj/item/device/dogborg/sleeper/servborg(src)
B.water = water
src.modules += B
//Service Module Copy/Paste
src.modules += new /obj/item/weapon/gripper/service(src)
src.modules += new /obj/item/weapon/reagent_containers/glass/bucket(src)
src.modules += new /obj/item/weapon/material/minihoe(src)
src.modules += new /obj/item/weapon/material/knife/machete/hatchet(src)
src.modules += new /obj/item/device/analyzer/plant_analyzer(src)
src.modules += new /obj/item/weapon/storage/bag/plants(src)
src.modules += new /obj/item/weapon/robot_harvester(src)
src.modules += new /obj/item/weapon/material/knife(src)
src.modules += new /obj/item/weapon/material/kitchen/rollingpin(src)
src.modules += new /obj/item/device/multitool(src) //to freeze trays
var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src)
M.stored_matter = 30
src.modules += M
src.modules += new /obj/item/weapon/reagent_containers/dropper/industrial(src)
var/obj/item/weapon/flame/lighter/zippo/L = new /obj/item/weapon/flame/lighter/zippo(src)
L.lit = 1
src.modules += L
src.modules += new /obj/item/weapon/tray/robotray(src)
src.modules += new /obj/item/weapon/reagent_containers/borghypo/service(src)
src.emag = new /obj/item/weapon/reagent_containers/food/drinks/bottle/small/beer(src)
var/datum/reagents/F = new/datum/reagents(50)
src.emag.reagents = F
F.my_atom = src.emag
F.add_reagent("beer2", 50)
src.emag.name = "Mickey Finn's Special Brew"
R.icon = 'icons/mob/widerobot_vr.dmi'
R.hands.icon = 'icons/mob/screen1_robot_vr.dmi'
R.ui_style_vr = TRUE
R.pixel_x = -16
R.old_x = -16
R.default_pixel_x = -16
R.dogborg = TRUE
R.wideborg = TRUE
R.verbs |= /mob/living/silicon/robot/proc/ex_reserve_refill
..()
/obj/item/weapon/robot_module/Reset(var/mob/living/silicon/robot/R)
R.pixel_x = initial(pixel_x)
R.pixel_y = initial(pixel_y)
@@ -23,28 +23,12 @@
var/zerg_types = list("Zerg Drone" = /mob/living/simple_animal/hostile/hivebot/zerg/worker,)
isSynthetic()
return FALSE
/mob/living/simple_animal/hostile/hivebot/zerg/isSynthetic()
return FALSE
/mob/living/simple_animal/hostile/hivebot/zerg/larva/proc/evolve()
//TODDO MAke this work nicely
set name = "EVOLVE"
set desc = "Performs larva evolution."
set category = "Abilities"
var/location = get_turf(src)
chosentype = input(usr,"What type would you like to be?") as null|anything in zerg_types
if(!chosentype) return
if(!src.ckey)
death()
qdel(src)
new /mob/living/simple_animal/hostile/hivebot/zerg/worker(location)
else
var/myuser = src.key
death()
qdel(src)
var/mob/living/simple_animal/hostile/newmob = new chosentype(location)
newmob.ckey = myuser
/////////////////////////////////////////////////////////////////
///////////////////// LARVA "CORE" //////////////////////////////
/////////////////////////////////////////////////////////////////
/mob/living/simple_animal/hostile/hivebot/zerg/larva
name = "zerg larva"
@@ -54,17 +38,45 @@
maxHealth = 0.2 LASERS_TO_KILL
health = 0.2 LASERS_TO_KILL
var/chosentype = null
/mob/living/simple_animal/hostile/hivebot/zerg/larva/Life()
..()
/mob/living/simple_animal/hostile/hivebot/zerg/larva/New()
..()
verbs |= /mob/living/simple_animal/hostile/hivebot/zerg/larva/proc/evolve
/mob/living/simple_animal/hostile/hivebot/zerg/larva/initialize()
spawn(1200)
if(!src.ckey)
evolve()
Life()
..()
New()
..()
verbs |= /mob/living/simple_animal/hostile/hivebot/zerg/larva/proc/evolve
initialize()
..()
spawn(1200)
if(!src.client)
evolve()
/////////////////////////////////////////////////////////////////
///////////////////// EVOLUTION /////////////////////////////////
/////////////////////////////////////////////////////////////////
/mob/living/simple_animal/hostile/hivebot/zerg/larva/proc/evolve()
//TODDO MAke this work nicely
set name = "EVOLVE"
set desc = "Performs larva evolution."
set category = "Abilities"
var/location = get_turf(src)
chosentype = input(usr,"What type would you like to be?") as null|anything in zerg_types
if(!chosentype && src.ckey) return
if(!src.client)
qdel(src)
new /mob/living/simple_animal/hostile/hivebot/zerg/worker(location)
else
var/myuser = src.key
var/mob/living/simple_animal/hostile/newmob = chosentype
death()
qdel(src)
newmob.ckey = myuser
new newmob(location)
/////////////////////////////////////////////////////////////////
///////////////////// ZERG TYPES ////////////////////////////////
/////////////////////////////////////////////////////////////////
/mob/living/simple_animal/hostile/hivebot/zerg/worker
name = "Zerg Drone"
desc = "Drones are fundamental to economic and tech development, as they harvest resources and construct buildings."
@@ -72,3 +84,17 @@
health = 1 LASERS_TO_KILL
melee_damage_lower = 1
melee_damage_upper = 1
/mob/living/simple_animal/hostile/hivebot/zerg/broodsack
name = "Zerg Brood"
desc = "Brood sacks are living creatures who's sole purpose it is to incubate larva."
maxHealth = 1
health = 1
melee_damage_lower = 0
melee_damage_upper = 0
Life()
sleep(3000)
new /mob/living/simple_animal/hostile/hivebot/zerg/larva(src.loc)
new /mob/living/simple_animal/hostile/hivebot/zerg/larva(src.loc)
new /mob/living/simple_animal/hostile/hivebot/zerg/larva(src.loc)
@@ -16,9 +16,9 @@
turns_per_move = 3
speed = 4
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "hits"
harm_intent_damage = 10
@@ -15,9 +15,9 @@
speed = 4
turns_per_move = 5
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "hits"
harm_intent_damage = 8
melee_damage_lower = 15
@@ -46,7 +46,7 @@
desc = "It's Coffee, the other pet!"
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "stomps"
response_harm = "stomps on"
//Sif Crabs
/mob/living/simple_animal/giant_crab
@@ -78,18 +78,18 @@
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "stomps"
response_harm = "kicks"
friendly = "pinches"
speak_chance = 1
speak_emote = list("clicks")
emote_hear = list("clicks")
emote_see = list("clacks")
//Enemy version.
/mob/living/simple_animal/hostile/giant_crab
/mob/living/simple_animal/hostile/giant_crab
name = "giant crab"
desc = "A giant enemy crab."
tt_desc = "S Cancer holligus"
@@ -116,7 +116,7 @@
attack_sharp = 1
attack_edge = 1
armor = list(
armor = list(
"melee" = 40,
"bullet" = 10,
"laser" = 25,
@@ -128,7 +128,7 @@
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "stomps"
response_harm = "kicks"
friendly = "pinches"
speak_chance = 1
@@ -1,5 +1,5 @@
/mob/living/simple_animal/deer
name = "Deer"
name = "deer"
desc = "An animal with impressive antlers and skittish personality, though this one seems domesticated."
tt_desc = "Cervus elaphus"
icon_state = "Deer"
@@ -50,7 +50,7 @@
response_help = "pets"
response_disarm = "barely manage to push aside"
response_harm = "nibbles"
response_harm = "hits"
attacktext = list("nibbled")
speak_chance = 20
@@ -83,6 +83,7 @@ Nurse Family
poison_type = "spidertoxin" // VOREStation edit, original is stoxin. (sleep toxins)
var/fed = 0
var/fedsmall = 0
var/atom/cocoon_target
var/egg_inject_chance = 5
@@ -518,7 +519,7 @@ Spider Procs
else
//third, lay an egg cluster there
var/obj/effect/spider/eggcluster/E = locate() in get_turf(src)
if(!E && fed > 0)
if(!E && fed > 0 || fedsmall > 0)
busy = LAYING_EGGS
src.visible_message("<span class='notice'>\The [src] begins to lay a cluster of eggs.</span>")
stop_automated_movement = 1
@@ -526,8 +527,12 @@ Spider Procs
if(busy == LAYING_EGGS)
E = locate() in get_turf(src)
if(!E)
new /obj/effect/spider/eggcluster(loc, src)
fed--
if(fed >= 1)
new /obj/effect/spider/eggcluster(loc, src)
fed--
if(fedsmall >= 1)
new /obj/effect/spider/eggcluster/small(loc, src)
fedsmall--
busy = 0
stop_automated_movement = 0
else
@@ -562,7 +567,10 @@ Spider Procs
if(istype(M, /mob/living/simple_animal/hostile/giant_spider))
continue
large_cocoon = 1
fed++
if(istiny(cocoon_target))
fedsmall++
if(!istiny(cocoon_target))
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
@@ -15,9 +15,9 @@
turns_per_move = 5
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "hits"
harm_intent_damage = 5
melee_damage_lower = 5 //they're meant to be annoying, not threatening.
@@ -1,5 +1,5 @@
/mob/living/simple_animal/lizard
name = "Lizard"
name = "lizard"
desc = "A cute tiny lizard."
faction = "lizard"
tt_desc = "E Anolis cuvieri"
@@ -25,11 +25,11 @@
speak_emote = list("hisses")
var/amount_grown = 0
/mob/living/simple_animal/lizard/event
desc = "This one looks like it is growing huge!"
/mob/living/simple_animal/lizard/event/Life()
. = ..()
if(amount_grown >= 0)
@@ -43,7 +43,7 @@
if(prob(99.999))
new /mob/living/simple_animal/hostile/lizardman(get_turf(src))
qdel(src)
else
else
new /mob/living/simple_animal/hostile/deathclaw(get_turf(src))
qdel(src)
@@ -0,0 +1,63 @@
//raccoon
/mob/living/simple_animal/raccoon
name = "raccoon"
desc = "A raccoon, also known as a trash panda."
tt_desc = "E purgamentum raccoonus"
intelligence_level = SA_ANIMAL
icon = 'icons/mob/animal_vr.dmi'
icon_state = "raccoon"
item_state = "raccoon"
icon_living = "raccoon"
icon_dead = "raccoon_dead"
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
response_help = "pets"
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("HSSSSS")
speak_emote = list("purrs")
emote_see = list("shakes their head", "shivers","grooms self", "nibbles on some trash")
say_maybe_target = list("Hss?")
say_got_target = list("HSSSS!","REEER!")
meat_amount = 1
meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat
var/turns_since_scan = 0
var/mob/flee_target
/mob/living/simple_animal/raccoon/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("HSSSSS")
stop_automated_movement = 1
walk_away(src, flee_target, 7, 2)
/mob/living/simple_animal/raccoon/react_to_attack(var/atom/A)
if(A == src) return
flee_target = A
turns_since_scan = 5
/mob/living/simple_animal/raccoon/ex_act()
. = ..()
react_to_attack(src.loc)
@@ -9,9 +9,9 @@
icon_dead = "sculpture"
emote_hear = list("makes a faint scraping sound")
emote_see = list("twitches slightly", "shivers")
response_help = "touches the"
response_disarm = "pushes the"
response_harm = "hits the"
response_help = "touches"
response_disarm = "pushes"
response_harm = "hits"
see_in_dark = 8 //Needs to see in darkness to snap in darkness
pass_flags = PASSTABLE
var/response_snap = "snapped the neck of" //Past tense because it "happened before you could see it"
@@ -20,6 +20,7 @@
var/transformed = FALSE
var/memorysize = 50 //Var for how many messages synxes remember if they know speechcode
var/list/voices = list()
var/forcefeedchance = 20
faction = "Synx"
intelligence_level = SA_ANIMAL
@@ -40,8 +41,8 @@
"rad" = 100)
has_hands = 1
response_help = "pets"
response_disarm = "gently pushes aside"
response_help = "pets the"
response_disarm = "gently pushes aside the"
pass_flags = PASSTABLE
@@ -182,7 +183,7 @@ mob/living/simple_animal/synx/PunchTarget()
metabolism = REM * 1 //ten times faster for convenience of testers.
color = "#00FFFF"
overdose = REAGENTS_OVERDOSE * 20 //it's all fake. But having nanomachines move through you is not good at a certain amount.
/datum/reagent/inaprovaline/synxchem/holo/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
if(alien != IS_DIONA)
if(prob(5))
@@ -230,8 +231,8 @@ mob/living/simple_animal/synx/PunchTarget()
M.adjustHalLoss(1) //dealing 5 times the amount of brute healed as halo, but we cant feel pain yet
// ^ I have no idea what this might cause, my ideal plan is that once the pain killer wears off you suddenly collapse;
//Since Halloss is not "real" damage this should not cause death
/datum/reagent/inaprovaline/synxchem/overdose(var/mob/living/carbon/M, var/alien, var/removed)
..()
if(alien != IS_DIONA)
@@ -242,7 +243,7 @@ mob/living/simple_animal/synx/PunchTarget()
M.AdjustStunned(1)
if(prob(2))
M.AdjustParalysis(1)
/datum/reagent/inaprovaline/synxchem/holo/overdose(var/mob/living/carbon/M, var/alien, var/removed)
return
@@ -257,7 +258,7 @@ mob/living/simple_animal/synx/PunchTarget()
if(.) // If we succeeded in hitting.
if(isliving(A))
var/mob/living/L = A
if(prob(20))//Forcefeeding code
if(prob(forcefeedchance))//Forcefeeding code
L.Weaken(5)
stop_automated_movement = 1
src.feed_self_to_grabbed(src,L)
@@ -274,6 +275,7 @@ mob/living/simple_animal/synx/PunchTarget()
/mob/living/simple_animal/retaliate/synx/hear_say(message,verb,language,fakename,isItalics,var/mob/living/speaker)
. = ..()
if(!message) return
if (speaker == src) return
speaker = speaker.GetVoice()
speak += message
voices += speaker
@@ -298,7 +300,7 @@ mob/living/simple_animal/synx/PunchTarget()
/mob/living/simple_animal/retaliate/synx/handle_idle_speaking()
if(voices && prob(speak_chance/2))
randomspeech()
//////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////// POWERS!!!! /////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
@@ -349,7 +351,7 @@ mob/living/simple_animal/synx/PunchTarget()
set category = "Abilities"
if(speak && voices)
handle_mimic()
else
else
usr << "<span class='warning'>YOU NEED TO HEAR THINGS FIRST, try using Ventcrawl to eevesdrop on nerds</span>"
/mob/living/simple_animal/retaliate/synx/proc/handle_mimic()
@@ -370,14 +372,14 @@ mob/living/simple_animal/synx/PunchTarget()
glow_range = 4
glow_toggle = 1
player_msg = "You aren't supposed to be in this. Wrong mob."
/mob/living/simple_animal/retaliate/synx/pet/init_vore()
..()
var/obj/belly/B = vore_selected
B.vore_verb = "swallow"
B.digest_burn = 1
B.digest_brute = 0
/mob/living/simple_animal/retaliate/synx/pet/holo/init_vore()
..()
var/obj/belly/B = vore_selected
@@ -408,7 +410,7 @@ mob/living/simple_animal/synx/PunchTarget()
var/location = get_turf(src)
new /obj/item/seeds/hardlightseed/typesx(location)
qdel(src)
/mob/living/simple_animal/retaliate/synx/pet/holo/gib()
visible_message("<span class='notice'>\The [src] fades away!</span>")
var/location = get_turf(src)
@@ -469,7 +471,7 @@ mob/living/simple_animal/synx/PunchTarget()
icon_state = "synx_diablo_living"
icon_living = "synx_diablo_living"
icon_dead = "synx_diablo_dead"
speak = list( )
speak = list( )
//Vore Section
vore_capacity = 2
@@ -479,7 +481,7 @@ mob/living/simple_animal/synx/PunchTarget()
icon_state = "synx_diablo_living"
icon_living = "synx_diablo_living"
icon_dead = "synx_diablo_dead"
speak = list( )
speak = list( )
//Vore Section
vore_capacity = 2
@@ -502,7 +504,7 @@ mob/living/simple_animal/synx/PunchTarget()
//Vore Section
vore_default_mode = DM_HEAL
vore_capacity = 10
vore_digest_chance = 0
vore_digest_chance = 0
vore_pounce_chance = 1 //MAKE THEM HONK
vore_bump_chance = 0 //lowered bump chance
vore_escape_chance = 100
@@ -549,3 +551,80 @@ mob/living/simple_animal/synx/PunchTarget()
else return pick(prob(50);/mob/living/simple_animal/retaliate/synx/pet/greed,
prob(50);/mob/living/simple_animal/retaliate/synx/pet/diablo,
prob(50);/mob/living/simple_animal/retaliate/synx/pet/holo,)
////////////////////////////////////////////////////////////////////////////
//////////////////////////NOT A SYNX///////but looks kinda like one/////////
////////////////////////////////////////////////////////////////////////////
//So we got base synxes pretty much done, how about some special variants
/mob/living/simple_animal/retaliate/synx/pet/weepinggamblers
name = "Synx?"
desc = "A cold blooded, genderless, parasitic eel? Is it crying?"
tt_desc = "Synxus?"
forcefeedchance = 99 //You have a stomach? yeah they go in.
poison_per_bite = 0 //no poison
hostile = 1
faction = "synx?"
melee_damage_lower = 1
melee_damage_upper = 1
environment_smash = 1
destroy_surroundings = 1
/mob/living/simple_animal/retaliate/synx/pet/weepinggamblers/New()
..()
faction = rand(1,5)
switch(faction)
if(1 , 2)
voices |= "Unidentifiable Weeping"
name = "Weeper"
melee_damage_upper = 4
if(3)
voices |= "Radio Static"
name = "Whistler"
melee_damage_upper = 20
if(4 , 5)
voices |= "Unidentifiable Wailing"
name= "Wailer"
melee_damage_upper = 10
speak |= "No one"
voices -= "Garbled voice"
voices -= "Unidentifiable Voice"
speak -= "Who is there?"
speak -= "What is that thing?!"
/mob/living/simple_animal/retaliate/synx/pet/weepinggamblers/MoveToTarget()
var/mob/living/speaker
if(target_mob)
speaker = target_mob
speak |= speaker.GetVoice()
..()
/mob/living/simple_animal/retaliate/synx/pet/weepinggamblers/Life()
..()
if(prob(1) && faction <= 5)
handlemutations(rand(1,5))
/mob/living/simple_animal/retaliate/synx/pet/weepinggamblers/proc/handlemutations(faction)
switch(faction)
if(1 , 2 , 11 , 12)
voices = "Unidentifiable Weeping"
name = "Weeper"
melee_damage_upper = 4
if(3 , 13)
voices = "Radio Static"
name = "Whistler"
melee_damage_upper = 20
if(4 , 5 , 14 , 15)
voices = "Unidentifiable Wailing"
name= "Wailer"
melee_damage_upper = 10
if(6 to 10 , 16 to 20)
voices = "Breathing"
name= "Silent"
else return
//WEEPING END
@@ -1,215 +1,226 @@
/mob/living/simple_animal/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
//CHOMPEDIT PIRANHA PLANT.
//When I stop being lazy I'll give this its own file -shark
//Yes I'm basing this shit on the tomato, sue me. -shark
//No longer based on tomato because evolved too far -shark
/mob/living/simple_animal/hostile/piranhaplant
name = "Piranha Plant"
desc = "It's a plant, that eats people!"
tt_desc = "Packun Flower"
faction = "plants"
intelligence_level = SA_PLANT
maxHealth = 50
health = 50
meat_type = null
//Mob icon/appearance settings
icon = 'icons/mob/plantmobs32x32.dmi' //Thanks to vorebound mod and Estelle
icon_living = "piranha-plant"
icon_state = "piranha-plant"
icon_dead = "piranha-plant_dead"
icon_gib = "generic_gib" // The iconstate for being gibbed, optional. Defaults to a generic gib animation.
//icon_rest = null // The iconstate for resting, optional
attack_icon = 'icons/effects/effects.dmi' //Just the default, played like the weapon attack anim
attack_icon_state = "slash" //Just the default //gonna have to make teeth chomping version
//Vore stuff
vore_active = 1
vore_capacity = 1
vore_pounce_chance = 10
vore_standing_too = 1
vore_ignores_undigestable = 0
vore_default_mode = DM_DIGEST
vore_digest_chance = 99
vore_absorb_chance = 0
vore_escape_chance = 5
vore_icons = SA_ICON_LIVING
swallowTime = 10 SECONDS //CHOMPED
//Movement Stuff
wander = 0 // Does the mob wander around when idle?
wander_distance = 0 // How far the mob will wander before going home (assuming they are allowed to do that)
returns_home = 1 // Mob knows how to return to wherever it started
turns_per_move = 4 // How many life() cycles to wait between each wander mov?
stop_when_pulled = 0 // When set to 1 this stops the animal from moving when someone is pulling it.
follow_dist = 0 // Distance the mob tries to follow a friend
speed = 4 // Higher speed is slower, negative speed is faster.
//Talk/Emote stuff
speak_chance = 0 // Probability that I talk (this is 'X in 200' chance since even 1/100 is pretty noisy)
reacts = 1 // Reacts to some things being said
speak = list() // Things I might say if I talk
emote_hear = list("chomps","snaps at the air") // Hearable emotes I might perform
emote_see = list() // Unlike speak_emote, the list of things in this variable only show by themselves with no spoken text. IE: Ian barks, Ian yaps
say_understood = list() // List of things to say when accepting an order
say_cannot = list() // List of things to say when they cannot comply
say_maybe_target = list() // List of things to say when they spot something barely
say_got_target = list() // List of things to say when they engage a target
reactions = list("chomp" = "!chomps",) // List of "string" = "reaction" and things they hear will be searched for string.
//Hostility war bloodshed, RAWR
hostile = 1 // Do I even attack?
view_range = 2 // Scan for targets in this range.
investigates = 1 // Do I investigate if I saw someone briefly?
cooperative = 1 // Do I ask allies to help me?
assist_distance = 2 // Radius in which I'll ask my comrades for help.
grab_resist = 100 // Chance of me resisting a grab attempt.
taser_kill = 1 // Is the mob weak to tasers
//Melee behaviour
melee_damage_lower = 1 // Lower bound of randomized melee damage
melee_damage_upper = 25 // Upper bound of randomized melee damage
attacktext = list("chomped","bit","hompfed","crunched","cronched") // "You are [attacktext] by the mob!"
friendly = list("nuzzles") // "The mob [friendly] the person."
//attack_sound = null // Sound to play when I attack
environment_smash = 0 // How much environment damage do I do when I hit stuff?
melee_miss_chance = 1 // percent chance to miss a melee attack.
melee_attack_minDelay = 5 // How long between attacks at least
melee_attack_maxDelay = 20 // How long between attacks at most
attack_armor_type = "bio" // What armor does this check?
attack_armor_pen = 50 // How much armor pen this attack has.
attack_sharp = 1 // Is the attack sharp?
attack_edge = 0 // Does the attack have an edge?
//Stuff for people wanting to be a fucking plant. Weirdos
show_stat_health = 1 // Does the percentage health show in the stat panel for the mob
ai_inactive = 0 // Set to 1 to turn off most AI actions
has_hands = 1 // Set to 1 to enable the use of hands and the hands hud
humanoid_hands = 1 // Can a player in this mob use things like guns or AI cards?
//hand_form = "hands" // Used in IsHumanoidToolUser. 'Your X are not fit-'.
//hud_gears // Slots to show on the hud (typically none)
//ui_icons // Icon file path to use for the HUD, otherwise generic icons are used
//r_hand_sprite = "piranha_r" // If they have hands, //TODO make a leaf sprite for this
//l_hand_sprite = "piranha_l" // they could use some icons.
player_msg = "PLANT GO CHOMP" // Message to print to players about 'how' to play this mob on login.
//Ranged variation
/mob/living/simple_animal/hostile/piranhaplant/spitter
//might snatch the code for that uranium ray for this since it should poison
name = "Piranha Spitter"
attack_armor_pen = 0
//Attack ranged settings.
ranged = 1 // Do I attack at range?
shoot_range = 6 // How far away do I start shooting from?
view_range = 5 //More range, more hurt, more... plant?
rapid = 1 // Three-round-burst fire mode
firing_lines = 0 // Avoids shooting allies
projectiletype = /obj/item/projectile/energy/piranhaspit // The projectiles I shoot
projectilesound = 'sound/weapons/thudswoosh.ogg' // The sound I make when I do it
casingtype = /obj/item/weapon/reagent_containers/food/snacks/soylentgreen/piranha // What to make the hugely laggy casings pile out of
//Piranha unique projectile
/obj/item/projectile/energy/piranhaspit
name = "piranhaspit"
icon_state = "neurotoxin"
damage = 4 //Reduced damage to 4 from 10, 3 fired projectiles mean might do 12 total if all 3 hit
damage_type = TOX
check_armour = "bio" //yup biohazard protection works here
flash_strength = 0
agony = 10
combustion = FALSE
/obj/item/weapon/reagent_containers/food/snacks/soylentgreen/piranha
name = "Soylent"
desc = "This was spat out by a strange plant that eats people."
icon_state = "soylent_green"
filling_color = "#B8E6B5"
center_of_mass = list("x"=15, "y"=11)
/obj/item/projectile/energy/piranhaspit/on_hit(var/atom/soyled)
soyl(soyled)
..()
/obj/item/projectile/energy/piranhaspit/proc/soyl(var/mob/M)
var/location = get_turf(M)
new /obj/item/weapon/reagent_containers/food/snacks/soylentgreen/piranha(location)
//VORE FLUFF section and extended gut settings
/mob/living/simple_animal/hostile/piranhaplant/init_vore()
..()
var/obj/belly/B = vore_selected
B.vore_verb = "chomp up"
B.name = "stomach"
B.desc = "You're pulled into the tight stomach of the plant. The walls knead weakly around you, coating you in thick, viscous fluids that cling to your body, that soon starts to tingle and burn..."
B.digest_burn = 0
B.digest_brute = 12
/mob/living/simple_animal/hostile/piranhaplant/pitcher
icon_state = "pitcher"
icon_living = "pitcher"
name = "Pitcher Plant"
desc = "It's a plant! How pretty"
tt_desc = "Brig Flower"
health = 50
maxHealth = 50 //starts with 50
var/antispam = 0
/mob/living/simple_animal/hostile/piranhaplant/pitcher/death()
..()
new /obj/item/weapon/reagent_containers/food/snacks/aesirsalad(location)
new /obj/item/weapon/reagent_containers/food/snacks/aesirsalad(location)
new /obj/item/weapon/reagent_containers/food/snacks/aesirsalad(location)
new /obj/item/weapon/reagent_containers/food/snacks/aesirsalad(location)
qdel(src)
/mob/living/simple_animal/hostile/piranhaplant/pitcher/Life()
..()
if(!anchored)
anchored=1
if(maxHealth <= 499) //Ok maybe there are limits
maxHealth = health //Limits are merely a suggestion
if(vore_fullness && !antispam)
antispam = 1
spawn(10)
if(maxHealth <= 499)
maxHealth += 1
health += 1
antispam = !antispam
if(size_multiplier!=1*health/100)
size_multiplier=1*health/100
update_icons()
/mob/living/simple_animal/hostile/piranhaplant/pitcher/init_vore()
..()
var/obj/belly/B = vore_selected
B.digest_burn = 0.5
B.digest_brute = 0
B.vore_verb = "slurped up"
B.name = "pitcher"
/mob/living/simple_animal/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
//CHOMPEDIT PIRANHA PLANT.
//When I stop being lazy I'll give this its own file -shark
//Yes I'm basing this shit on the tomato, sue me. -shark
//No longer based on tomato because evolved too far -shark
/mob/living/simple_animal/hostile/piranhaplant
name = "Piranha Plant"
desc = "It's a plant, that eats people!"
tt_desc = "Packun Flower"
faction = "plants"
intelligence_level = SA_PLANT
maxHealth = 50
health = 50
meat_type = null
//Mob icon/appearance settings
icon = 'icons/mob/plantmobs32x32.dmi' //Thanks to vorebound mod and Estelle
icon_living = "piranha-plant"
icon_state = "piranha-plant"
icon_dead = "piranha-plant_dead"
icon_gib = "generic_gib" // The iconstate for being gibbed, optional. Defaults to a generic gib animation.
//icon_rest = null // The iconstate for resting, optional
attack_icon = 'icons/effects/effects.dmi' //Just the default, played like the weapon attack anim
attack_icon_state = "slash" //Just the default //gonna have to make teeth chomping version
//Vore stuff
vore_active = 1
vore_capacity = 1
vore_pounce_chance = 10
vore_standing_too = 1
vore_ignores_undigestable = 0
vore_default_mode = DM_DIGEST
vore_digest_chance = 99
vore_absorb_chance = 0
vore_escape_chance = 5
vore_icons = SA_ICON_LIVING
swallowTime = 10 SECONDS //CHOMPED
//Movement Stuff
wander = 0 // Does the mob wander around when idle?
wander_distance = 0 // How far the mob will wander before going home (assuming they are allowed to do that)
returns_home = 1 // Mob knows how to return to wherever it started
turns_per_move = 4 // How many life() cycles to wait between each wander mov?
stop_when_pulled = 0 // When set to 1 this stops the animal from moving when someone is pulling it.
follow_dist = 0 // Distance the mob tries to follow a friend
speed = 4 // Higher speed is slower, negative speed is faster.
entangle_immunity = 1 //makes mob immune to entangle effect of vines and also wont get stabbed by vines that has thorns
//Talk/Emote stuff
speak_chance = 0 // Probability that I talk (this is 'X in 200' chance since even 1/100 is pretty noisy)
reacts = 1 // Reacts to some things being said
speak = list() // Things I might say if I talk
emote_hear = list("chomps","snaps at the air") // Hearable emotes I might perform
emote_see = list() // Unlike speak_emote, the list of things in this variable only show by themselves with no spoken text. IE: Ian barks, Ian yaps
say_understood = list() // List of things to say when accepting an order
say_cannot = list() // List of things to say when they cannot comply
say_maybe_target = list() // List of things to say when they spot something barely
say_got_target = list() // List of things to say when they engage a target
reactions = list("chomp" = "!chomps",) // List of "string" = "reaction" and things they hear will be searched for string.
//Hostility war bloodshed, RAWR
hostile = 1 // Do I even attack?
view_range = 2 // Scan for targets in this range.
investigates = 1 // Do I investigate if I saw someone briefly?
cooperative = 1 // Do I ask allies to help me?
assist_distance = 2 // Radius in which I'll ask my comrades for help.
grab_resist = 100 // Chance of me resisting a grab attempt.
taser_kill = 1 // Is the mob weak to tasers
//Melee behaviour
melee_damage_lower = 1 // Lower bound of randomized melee damage
melee_damage_upper = 25 // Upper bound of randomized melee damage
attacktext = list("chomped","bit","hompfed","crunched","cronched") // "You are [attacktext] by the mob!"
friendly = list("nuzzles") // "The mob [friendly] the person."
//attack_sound = null // Sound to play when I attack
environment_smash = 0 // How much environment damage do I do when I hit stuff?
melee_miss_chance = 1 // percent chance to miss a melee attack.
melee_attack_minDelay = 5 // How long between attacks at least
melee_attack_maxDelay = 20 // How long between attacks at most
attack_armor_type = "bio" // What armor does this check?
attack_armor_pen = 50 // How much armor pen this attack has.
attack_sharp = 1 // Is the attack sharp?
attack_edge = 0 // Does the attack have an edge?
//Stuff for people wanting to be a fucking plant. Weirdos
show_stat_health = 1 // Does the percentage health show in the stat panel for the mob
ai_inactive = 0 // Set to 1 to turn off most AI actions
has_hands = 1 // Set to 1 to enable the use of hands and the hands hud
humanoid_hands = 1 // Can a player in this mob use things like guns or AI cards?
//hand_form = "hands" // Used in IsHumanoidToolUser. 'Your X are not fit-'.
//hud_gears // Slots to show on the hud (typically none)
//ui_icons // Icon file path to use for the HUD, otherwise generic icons are used
//r_hand_sprite = "piranha_r" // If they have hands, //TODO make a leaf sprite for this
//l_hand_sprite = "piranha_l" // they could use some icons.
player_msg = "PLANT GO CHOMP" // Message to print to players about 'how' to play this mob on login.
//Ranged variation
/mob/living/simple_animal/hostile/piranhaplant/spitter
//might snatch the code for that uranium ray for this since it should poison
name = "Piranha Spitter"
attack_armor_pen = 0
//Attack ranged settings.
ranged = 1 // Do I attack at range?
shoot_range = 6 // How far away do I start shooting from?
view_range = 5 //More range, more hurt, more... plant?
rapid = 1 // Three-round-burst fire mode
firing_lines = 0 // Avoids shooting allies
projectiletype = /obj/item/projectile/energy/piranhaspit // The projectiles I shoot
projectilesound = 'sound/weapons/thudswoosh.ogg' // The sound I make when I do it
ranged_ignore_incapitated = 1 //make it so our spitter doesnt stun lock dorks
ranged_cooldown_time = 90
//mob/living/simple_animal/hostile/piranhaplant/spitter/proc/Shoot()
//TOX/HALLOSS swap code goes here //TODO
//Piranha unique projectile
/obj/item/projectile/energy/piranhaspit
name = "piranha spit"
icon_state = "neurotoxin"
damage = 10
damage_type = HALLOSS
check_armour = "bio" //yup biohazard protection works here
flash_strength = 0
agony = 10
combustion = FALSE
/obj/item/weapon/reagent_containers/food/snacks/soylentgreen/piranha
name = "Soylent"
desc = "This was spat out by a strange plant that eats people."
icon_state = "soylent_green"
filling_color = "#B8E6B5"
center_of_mass = list("x"=15, "y"=11)
/obj/item/projectile/energy/piranhaspit/on_hit(var/atom/soyled)
if(prob(5))
soyl(soyled)
..()
/obj/item/projectile/energy/piranhaspit/proc/soyl(var/mob/M)
var/location = get_turf(M)
new /obj/item/weapon/reagent_containers/food/snacks/soylentgreen/piranha(location)
//VORE FLUFF section and extended gut settings
/mob/living/simple_animal/hostile/piranhaplant/init_vore()
..()
var/obj/belly/B = vore_selected
B.vore_verb = "chomp up"
B.name = "stomach"
B.desc = "You're pulled into the tight stomach of the plant. The walls knead weakly around you, coating you in thick, viscous fluids that cling to your body, that soon starts to tingle and burn..."
B.digest_burn = 0
B.digest_brute = 12
/mob/living/simple_animal/hostile/piranhaplant/pitcher
icon_state = "pitcher-plant"
icon_living = "pitcher-plant"
icon_dead = "pitcher-plant_dead"
name = "Pitcher Plant"
desc = "It's a plant! How pretty"
tt_desc = "Brig Flower"
health = 500
maxHealth = 500
var/antispam = 0
swallowTime = 3 SECONDS //If you get to close to a pitcher, its your own fault ;p
/mob/living/simple_animal/hostile/piranhaplant/pitcher/death()
..()
new /obj/item/weapon/reagent_containers/food/snacks/aesirsalad(location)
new /obj/item/weapon/reagent_containers/food/snacks/aesirsalad(location)
new /obj/item/weapon/reagent_containers/food/snacks/aesirsalad(location)
new /obj/item/weapon/reagent_containers/food/snacks/aesirsalad(location)
qdel(src)
/mob/living/simple_animal/hostile/piranhaplant/pitcher/Life()
..()
if(!anchored)
anchored=1
if(vore_fullness && !antispam)
antispam = 1
spawn(10)
if(bruteloss >= 1)
bruteloss -= 1
antispam = !antispam
if(prob(3))
new /obj/item/weapon/reagent_containers/food/snacks/soylentgreen/piranha(src.loc)
if(size_multiplier!=1*health/100 && health >= 50 && health <= 300)
size_multiplier=1*health/100
update_icons()
/mob/living/simple_animal/hostile/piranhaplant/pitcher/New()
..()
bruteloss = 400
/mob/living/simple_animal/hostile/piranhaplant/pitcher/init_vore()
..()
var/obj/belly/B = vore_selected
B.digest_burn = 0.5
B.digest_brute = 0
B.vore_verb = "slurp up"
B.name = "pitcher"
@@ -20,7 +20,7 @@
response_help = "touches"
response_disarm = "flails at"
response_harm = "punches the"
response_harm = "punches"
harm_intent_damage = 2
@@ -19,7 +19,7 @@
firing_lines = TRUE
investigates = TRUE
assist_distance = 100
turns_per_move = 5
stop_when_pulled = 0
@@ -85,9 +85,9 @@
icon_gib = "clown_gib"
speak_chance = 50
turns_per_move = 5
response_help = "pokes the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
response_help = "pokes"
response_disarm = "gently pushes aside"
response_harm = "hits"
speak = list("HONK", "Honk!")
speak_emote = list("squeals", "cries","sobs")
emote_hear = list("honks sadly")
@@ -127,15 +127,15 @@
icon_state = "ClownGoblin"
icon_living = "ClownGoblin"
icon_dead = null
response_help = "honks the"
response_help = "honks"
speak = list("Honk!")
speak_emote = list("sqeaks")
emote_hear = list("honks")
maxHealth = 100
health = 100
view_range = 30//owo
speed = 1
turns_per_move = 1
@@ -165,7 +165,7 @@
/mob/living/simple_animal/clowngang
name = "Pandoras box"
desc = "A honkmotherload of fun"
/mob/living/simple_animal/clowngang/Life()
death()
/mob/living/simple_animal/clowngang/death()
@@ -1,5 +1,5 @@
/mob/living/simple_animal/hostile/pirate
name = "Pirate"
name = "pirate"
desc = "Does what he wants cause a pirate is free."
tt_desc = "E Homo sapiens"
icon_state = "piratemelee"
@@ -121,7 +121,8 @@
var/retreat_distance = null //If our mob runs from players when they're too close, set in tile distance. By default, mobs do not retreat.
var/minimum_distance = 1 //Minimum approach distance, so ranged mobs chase targets down, but still keep their distance set in tiles to the target, set higher to make mobs keep distance
var/move_shoot = 0
var/ranged_ignore_incapitated = 0 //Ranged mobs will by default keep shooting on unconscious targets, if set to 1 the mob will ignore unconscious victims.
//Mob melee settings
var/melee_damage_lower = 2 // Lower bound of randomized melee damage
var/melee_damage_upper = 6 // Upper bound of randomized melee damage
@@ -1270,19 +1271,24 @@
ai_log("AttackTarget() special",3)
if(SpecialAtkTarget()) //Might not succeed/be allowed, do something else.
return 1
//AAAAH!
if(distance <= 1)
ai_log("AttackTarget() melee",3)
PunchTarget()
return 1
//Open fire!
else if(ranged && (distance <= shoot_range) && ranged_cooldown <= world.time)
if(ishuman(target_mob) && ranged_ignore_incapitated)
var/mob/living/carbon/human/TA = target_mob
if(TA.stat == UNCONSCIOUS)
LoseTarget(TA)
return
ai_log("AttackTarget() ranged",3)
ShootTarget(target_mob)
return 1
else
ai_log("AttackTarget() out of range!",3)
stoplag(1) // Unfortunately this is needed to protect from ClosestDistance() sometimes not updating fast enough to prevent an infinite loop.
@@ -1777,5 +1783,5 @@
/mob/living/simple_animal/get_nametag_desc(mob/user)
return "<i>[tt_desc]</i>"
@@ -18,9 +18,9 @@
returns_home = 1
reacts = 1
response_help = "pats the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
response_help = "pats"
response_disarm = "gently pushes aside"
response_harm = "hits"
harm_intent_damage = 8
melee_damage_lower = 15
@@ -9,9 +9,9 @@
speak = list("Buzzzz")
speak_chance = 1
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "hits"
turns_per_move = 5
speed = 5
@@ -25,9 +25,9 @@
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"
response_help = "pets"
response_disarm = "bops"
response_harm = "hits"
attacktext = list("ravaged")
friendly = list("nuzzles", "slobberlicks", "noses softly at", "noseboops", "headbumps against", "leans on", "nibbles affectionately on")
@@ -61,3 +61,70 @@
// maxHealth = 200
// health = 200
// faction = "virgo3b"
/mob/living/simple_animal/hostile/dragon/phoron
name = "phoron dragon"
desc = "A big imposing phoron dragon, it looks tough and would likely not go down without a fierce fight."
icon_dead = "phoron_dragon_dead"
icon_living = "phoron_dragon"
icon_state = "phoron_dragon"
maxHealth = 1000 // Super Boss
health = 1000
var/image/eye_layer = null
/mob/living/simple_animal/hostile/dragon/phoron/New(var/location, var/atom/parent)
if(!eye_layer)
get_light_and_color(parent)
add_glow()
..()
/mob/living/simple_animal/hostile/dragon/phoron/proc/add_glow()
eye_layer = image(icon, "[icon_state]-glow")
eye_layer.plane = PLANE_LIGHTING_ABOVE
overlays |= eye_layer
/mob/living/simple_animal/hostile/dragon/phoron/death()
remove_glow()
..()
/mob/living/simple_animal/hostile/dragon/phoron/proc/remove_glow()
overlays -= eye_layer
/mob/living/simple_animal/hostile/dragon/phoron/update_icon()
. = ..()
if(stat >= DEAD)
return
add_glow()
/mob/living/simple_animal/hostile/dragon/phoron/init_vore()
..()
var/obj/belly/B = vore_selected
B.name = "Belly"
B.desc = "The phoron dragon tackles you to the ground with a mighty roar, swiftly gobbling up your head! You feel the gravity shift as it raises it's head up in pride, bobbing you up and down as it busily swallowed around your form. You start to realise that the warm fluid that you mistook for it's saliva has a strong and somewhat familiar scent, but before you can identify it, your ride is over - with a powerful swallow, the dragon pushes the entirety of your body down into it's stomach, with more of that strange liquid pooling up on the bottom. As you push out in protest against the surrounding walls, you realise that the flesh feels squishy and sponge-like under your digits, coating them in dark, pink substance... A pleased rumble from above tells you that the dragon clearly doesn't seem to mind your futile struggles, clenching its stomach around you possessively!"
B.emote_lists[DM_HOLD] = list(
"The sway of the dragon's belly sloshes the purple tinted fluid around you, splashing it all over your body.",
"You can feel a small prod from the outside as the dragon accidentally brushes his gut against a wall. The soft flesh cushions it just enough for it to be barely noticeable...",
"You briefly get lost in thoughts as you listen to the noises the dragon's body emits... A slightly muffled snort from above that is enough for you to snap back.",
"A sizeable paw smacks on the side of the dragon's belly, kneading into you through the thick layer of flesh while a low, ominous chuckle can be heard.",
"A low, guttural grumble can be heard all around you as the dragon idly flumps down, bringing its weight down to smoosh you against the bottom of its gut!",
"You can feel a faint, rythmic thumping coming off from the sides of the belly - it doesn't take long to realise that the dragon is drumming on its stuffed gut with its wings.",
"The dragon sways its hips briefly, making its stomach - and by extension, you - sway along, letting out an ammused rumble!",
"You can feel the stomach clench around you, briefly pushing you out towards the dragon's gullet, but before you can gather your wits, it simply swallows you back down with a taunting rumble.",
"You sigh and idly drag your hand over the stomach walls, silently pondering your life choices. It surprises you to feel a large paw tracing your movements from outside!")
B.emote_lists[DM_DIGEST] = list(
"The sway of the dragon's belly sloshes the purple tinted fluid around you, splashing it all over your body.",
"You can feel a small prod from the outside as the dragon accidentally brushes his gut against a wall. The soft flesh cushions it just enough for it to be barely noticeable...",
"A sizeable paw smacks on the side of the dragon's belly, kneading into you through the thick layer of flesh while a low, ominous chuckle can be heard.",
"A low, guttural grumble can be heard all around you as the dragon idly flumps down, bringing its weight down to smoosh you against the bottom of its gut!",
"You can feel a faint, rythmic thumping coming off from the sides of the belly - it doesn't take long to realise that the dragon is drumming on its stuffed gut with its wings.",
"The dragon sways its hips briefly, making its stomach - and by extension, you - sway along, letting out an ammused rumble!",
"You can feel the stomach clench around you, briefly pushing you out towards the dragon's gullet, but before you can gather your wits, it simply swallows you back down with a taunting rumble.")
//Didnt put in since it works better as active struggle messages, but not gonna write any at the moment :c
//You struggle to push out against the surrounding flesh, but as soon as you ease up on the pressure, the dragon's gut simply pushes back to hide the bulge.
@@ -12,9 +12,9 @@
maxHealth = 30
health = 30
response_help = "pats the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
response_help = "pats"
response_disarm = "gently pushes aside"
response_harm = "hits"
harm_intent_damage = 5
melee_damage_lower = 5
@@ -24,9 +24,9 @@
speak_emote = list("growls","hisses")
say_maybe_target = list("Rawr?")
say_got_target = list("GWAR!!")
response_help = "pets the"
response_disarm = "bops the"
response_harm = "hits the"
response_help = "pets"
response_disarm = "bops"
response_harm = "hits"
attacktext = list("bit")
friendly = list("nuzzles", "licks", "noses softly at", "noseboops", "headbumps against", "leans on", "nibbles affectionately on")
@@ -19,9 +19,9 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
maxHealth = 25
health = 25
speed = 4
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
response_help = "pets"
response_disarm = "gently pushes aside"
response_harm = "hits"
harm_intent_damage = 5
isEdible = 0 //They cannot be eaten while alive.
var/canEvolve = 1 //A variable for admins to turn off and on for when they like assign a player as a mob. I want to add a verb so that they can do it on command when the conditions are right in the future.
@@ -49,14 +49,14 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
emote_see = list("SKREE's")
meat_type = /obj/item/toy/figure/samus
var/mob/living/victim = null // the person the metroid is currently feeding on
var/optimal_combat = FALSE // Used to dumb down the combat AI somewhat. If true, the metroid tends to be really dangerous to fight alone due to stunlocking.
var/power_charge = 0
var/evo_point = 0
var/evo_limit = 0
var/next = null
//Stuff for if a person is playing as a metroid.
show_stat_health = 1 // Does the percentage health show in the stat panel for the mob
ai_inactive = 0 // Set to 1 to turn off most AI actions
@@ -68,10 +68,10 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
//r_hand_sprite = "piranha_r" // If they have hands, //TODO make a leaf sprite for this
//l_hand_sprite = "piranha_l" // they could use some icons.
player_msg = "SUCC." // Message to print to players about 'how' to play this mob on login.
/mob/living/simple_animal/hostile/metroid //activate noms
vore_active = 1
vore_pounce_chance = 25
@@ -81,8 +81,8 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
/mob/living/simple_animal/hostile/metroid/death()
playsound(src, 'sound/effects/metroiddeath.ogg', 50, 1)
..()
/mob/living/simple_animal/hostile/metroid/mine
name = "Mochtroid"
@@ -125,7 +125,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
melee_damage_lower = 1
melee_damage_upper = 5
melee_miss_chance = 0
armor = list(
armor = list(
"melee" = 50,
"bullet" = 30,
"laser" = 80,
@@ -164,20 +164,20 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
cooperative = 1
evo_point = 800
evo_limit = 1000
next = "/mob/living/simple_animal/hostile/metroid/evolution/super"
next = "/mob/living/simple_animal/hostile/metroid/evolution/super"
vore_active = 0
/mob/living/simple_animal/hostile/metroid/evolution/baby/New()
playsound(src, 'sound/metroid/metroidsee.ogg', 100, 1)
..()
//------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------
/mob/living/simple_animal/hostile/metroid/evolution/super
name = "super metroid"
desc = "Some kind of head sucky thing!"
@@ -193,7 +193,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
melee_damage_lower = 2
melee_damage_upper = 5
melee_miss_chance = 0
armor = list(
armor = list(
"melee" = 50,
"bullet" = 30,
"laser" = 90,
@@ -232,7 +232,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
evo_point = 1200
evo_limit = 1400
next = "/mob/living/simple_animal/hostile/metroid/combat/alpha"
vore_active = 1
vore_bump_chance = 0
vore_capacity = 1
@@ -240,20 +240,20 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
vore_pounce_chance = 25 //Metroids only eat incapacitated targets
vore_default_mode = DM_DIGEST
swallowTime = 1 SECONDS //Hungry little bastards.
vore_escape_chance = 25
vore_escape_chance = 25
/mob/living/simple_animal/hostile/metroid/evolution/super/New()
playsound(src, 'sound/metroid/metroidsee.ogg', 100, 1)
..()
/mob/living/simple_animal/hostile/metroid/evolution/super/death()
playsound(src, 'sound/metroid/metroiddeath.ogg', 100, 1)
..()
//------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------
@@ -272,7 +272,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
melee_damage_upper = 15
melee_miss_chance = 5
attacktext = list("rammed")
armor = list(
armor = list(
"melee" = 60,
"bullet" = 45,
"laser" = 50,
@@ -283,7 +283,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
gender = NEUTER
faction = "metroids"
move_to_delay = 3
//Alphas lose their vulnerability to cold.
minbodytemp = 0
min_oxy = 0
@@ -327,14 +327,14 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
vore_icons = SA_ICON_LIVING
vore_pounce_chance = 15 //Alphas will try knocking targets over since they lost their stun ability from the initial phases.
vore_default_mode = DM_DIGEST
swallowTime = 3 SECONDS
swallowTime = 3 SECONDS
vore_escape_chance = 25
//------------------------------------------------------------------------------------------------------------
@@ -354,7 +354,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
melee_damage_upper = 20
melee_miss_chance = 5
attacktext = list("rammed")
armor = list(
armor = list(
"melee" = 60,
"bullet" = 50,
"laser" = 50,
@@ -365,7 +365,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
gender = NEUTER
faction = "metroids"
move_to_delay = 4
move_shoot = 1 //Move and shoot at the same time.
ranged_cooldown = 0 //What the starting cooldown is on ranged attacks
ranged_cooldown_time = 150 //How long, in deciseconds, the cooldown of ranged attacks is
@@ -407,7 +407,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
/mob/living/simple_animal/hostile/metroid/combat/gamma/New()
playsound(src, 'sound/metroid/metroidgamma.ogg', 100, 1)
..()
/mob/living/simple_animal/hostile/metroid/combat/gamma/death()
playsound(src, 'sound/metroid/metroiddeath.ogg', 100, 1)
..()
@@ -417,14 +417,14 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
vore_bump_chance = 0
vore_capacity = 1
vore_icons = SA_ICON_LIVING
vore_pounce_chance = 15
vore_pounce_chance = 15
vore_default_mode = DM_DIGEST
swallowTime = 3 SECONDS
swallowTime = 3 SECONDS
vore_escape_chance = 20
//------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------
@@ -444,7 +444,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
melee_miss_chance = 5
attack_armor_pen = 10
attacktext = list("slashed")
armor = list(
armor = list(
"melee" = 70,
"bullet" = 60,
"laser" = 50,
@@ -455,7 +455,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
gender = NEUTER
faction = "metroids"
move_to_delay = 4
move_shoot = 1 //Move and shoot at the same time.
ranged_cooldown = 0 //What the starting cooldown is on ranged attacks
ranged_cooldown_time = 60 //How long, in deciseconds, the cooldown of ranged attacks is
@@ -474,7 +474,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
min_n2 = 0
max_n2 = 0
unsuitable_atoms_damage = 0
pixel_x = -16
pixel_y = -16
old_x = -16
@@ -499,7 +499,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
/mob/living/simple_animal/hostile/metroid/combat/zeta/New()
playsound(src, 'sound/metroid/metroidzeta.ogg', 100, 1)
..()
/mob/living/simple_animal/hostile/metroid/combat/zeta/death()
playsound(src, 'sound/metroid/metroiddeath.ogg', 100, 1)
..()
@@ -509,15 +509,15 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
vore_bump_chance = 0
vore_capacity = 1
vore_icons = SA_ICON_LIVING
vore_pounce_chance = 20
vore_pounce_chance = 20
vore_default_mode = DM_DIGEST
swallowTime = 3 SECONDS
swallowTime = 3 SECONDS
vore_escape_chance = 15
//------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------
@@ -537,7 +537,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
melee_miss_chance = 5
attack_armor_pen = 20
attacktext = list("slashed")
armor = list(
armor = list(
"melee" = 75,
"bullet" = 60,
"laser" = 55,
@@ -549,7 +549,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
faction = "metroids"
speed = 4
move_to_delay = 5
move_shoot = 1 //Move and shoot at the same time.
ranged_cooldown = 0 //What the starting cooldown is on ranged attacks
ranged_cooldown_time = 150 //How long, in deciseconds, the cooldown of ranged attacks is
@@ -568,7 +568,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
min_n2 = 0
max_n2 = 0
unsuitable_atoms_damage = 0
old_x = -16
old_y = 0
default_pixel_x = -16
@@ -593,7 +593,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
/mob/living/simple_animal/hostile/metroid/combat/omega/New()
playsound(src, 'sound/metroid/metroidomega.ogg', 100, 1)
..()
/mob/living/simple_animal/hostile/metroid/combat/omega/death()
playsound(src, 'sound/metroid/metroidomegadeath.ogg', 100, 1)
..()
@@ -603,21 +603,21 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
vore_bump_chance = 0
vore_capacity = 2
vore_icons = SA_ICON_LIVING
vore_pounce_chance = 40
vore_pounce_chance = 40
vore_default_mode = DM_DIGEST
swallowTime = 3 SECONDS
vore_escape_chance = 5
//------------------------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------------------------
/mob/living/simple_animal/hostile/metroid/combat/queen
name = "queen metroid"
desc = "The mother of all Metroids, allowed to have grown too far!"
desc = "The mother of all Metroids - allowed to have grown too far!"
tt_desc = "Maximus Queenamus Deathamus"
icon = 'icons/mob/metroid/queen.dmi'
icon_dead = "queen_dead"
@@ -631,7 +631,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
melee_miss_chance = 5
attack_armor_pen = 20
attacktext = list("gnashed")
armor = list(
armor = list(
"melee" = 75,
"bullet" = 60,
"laser" = 60,
@@ -661,7 +661,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
min_n2 = 0
max_n2 = 0
unsuitable_atoms_damage = 0
pixel_x = -16
pixel_y = -16
old_x = -16
@@ -677,18 +677,19 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
cooperative = 1
evo_point = 1100
evo_limit = INFINITY
next = "/mob/living/simple_animal/hostile/metroid/evolution/super"
next = null
/mob/living/simple_animal/hostile/metroid/combat/queen/New()
playsound(src, 'sound/metroid/metroidqueen.ogg', 100, 1)
queen_amount++
..()
/mob/living/simple_animal/hostile/metroid/combat/queen/death()
playsound(src, 'sound/metroid/metroidqueendeath.ogg', 100, 1)
queen_amount--
..()
/mob/living/simple_animal/hostile/metroid/combat/queen //active noms
vore_active = 1
vore_bump_chance = 0
@@ -705,13 +706,13 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
/*
//Objects related to the Metroids.
//Objects related to the Metroids.
//Projectile for the Metroids.
*/
/obj/item/projectile/energy/metroidacid
name = "metroid acid"
icon_state = "neurotoxin"
damage = 10
@@ -719,7 +720,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
agony = 10
check_armour = "bio"
armor_penetration = 50
//EGG! Metroid egg and its mechanics. Ripped from spiders.
/obj/effect/metroid/egg
name = "egg cluster"
@@ -757,9 +758,9 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
//------------------------------------------------------------------------------------------------------------
/*
//LIFE STUFF, AND MECHANICS!
@@ -775,7 +776,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
release_vore_contents()
prey_excludes.Cut()
stop_consumption()
if(canEvolve == 1 && nutrition >= evo_point && !buckled && vore_fullness == 0 && !victim)
playsound(src, 'sound/metroid/metroidgrow.ogg', 50, 1)
paralysis = 7998
@@ -793,8 +794,8 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
new next(get_turf(src))
visible_message("<span class='warning'>\The [src] suddenly evolves!</span>")
qdel(src)
/mob/living/simple_animal/hostile/metroid/evolution/handle_regular_status_updates()
if(stat != DEAD)
@@ -816,7 +817,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
visible_message("<span class='danger'>\The [src] starts trying to slide itself into the vent!</span>")
sleep(50) //Let's stop the metroid for five seconds to do its parking job
..()
if(entry_vent.network && entry_vent.network.normal_members.len)
if(!victim && !buckled && vore_fullness == 0 && entry_vent.network && entry_vent.network.normal_members.len)
var/list/vents = list()
for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in entry_vent.network.normal_members)
vents.Add(temp_vent)
@@ -848,7 +849,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
if(prob(input * 2)) // Gain around one level per 50 nutrition
power_charge = min(power_charge++, 10)
/mob/living/simple_animal/hostile/metroid/evolution/PunchTarget() //this segment determines what the mob does depending on its intent.
if(victim)
return // Already eatting someone.
@@ -953,7 +954,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
/mob/living/simple_animal/hostile/metroid/evolution/DoPunch(var/mob/living/L) //Metroid melee.
var/damage_to_do = rand(melee_damage_lower, melee_damage_upper)
var/armor_modifier = abs((L.getarmor(null, "bio") / 100) - 1)
if(!Adjacent(L)) // Might've moved away in the meantime.
return
@@ -1061,8 +1062,8 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
paralysis = 7998
sleep(50)
paralysis = 0
/mob/living/simple_animal/hostile/metroid/evolution/FindTarget() //This makes it so it doesn't go after another target while succing.
if(victim) // Don't worry about finding another target if we're sucking on someone's head.
return
@@ -1080,9 +1081,9 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
return
else
..()
/mob/living/simple_animal/hostile/metroid/evolution/baby/Found(mob/living/L)
if(isliving(L))
if(SA_attackable(L))
@@ -1093,21 +1094,21 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
return H // Monkeys are always food.
else
return
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(istype(H.species, /datum/species/monkey)) // istype() is so they'll eat the alien monkeys too.
return H // Monkeys are always food.
return
/*
//LIFE PROCS!
//FOR THE COMBAT FORMS
//LIFE PROCS!
//FOR THE COMBAT FORMS
*/
@@ -1118,32 +1119,23 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
if(canEvolve == 1 && nutrition >= evo_limit && vore_fullness == TRUE) //spit dat crap out if nutrition gets too high!
release_vore_contents()
prey_excludes.Cut()
if(canEvolve == 1 && nutrition >= evo_point && vore_fullness == 0)
if(canEvolve == 1 && nutrition >= evo_point && vore_fullness == 0 && next != "/mob/living/simple_animal/hostile/metroid/combat/queen")
playsound(src, 'sound/metroid/metroidgrow.ogg', 50, 1)
paralysis = 7998
sleep(50)
paralysis = 0
expand_troid()
return
if(stance == 7) //Necessary to fix a bug where if their prey or latching victim is laying down when they evolve, they get stuck in stance 7 and do nothing.
stance = 4
return
/mob/living/simple_animal/hostile/metroid/combat/omega/Life()
. = ..()
if(queen_amount == 0 && prob(5) && canEvolve == 1 && nutrition >= evo_point)
else if(queen_amount == 0 && prob(5) && canEvolve == 1 && nutrition >= evo_point && vore_fullness == 0 && next == "/mob/living/simple_animal/hostile/metroid/combat/queen")
playsound(src, 'sound/metroid/metroidgrow.ogg', 50, 1)
queen_amount++
paralysis = 7998
sleep(50)
paralysis = 0
expand_troid()
/mob/living/simple_animal/hostile/metroid/combat/queen/Life()
. = ..()
var/obj/effect/metroid/egg/E = locate() in get_turf(src)
if(canEvolve == 1 && nutrition >= evo_point && !E)
else if(next == null && canEvolve == 1 && nutrition >= evo_point)
playsound(src, 'sound/metroid/metroidgrow.ogg', 50, 1)
src.visible_message("<span class='notice'>\The [src] begins to lay an egg.</span>")
stop_automated_movement = 1
@@ -1153,7 +1145,12 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
nutrition = 400
return
if(stance == 7) //Necessary to fix a bug where if their prey or latching victim is laying down when they evolve, they get stuck in stance 7 and do nothing.
stance = 4
return
/mob/living/simple_animal/hostile/metroid/combat/proc/adjust_nutrition(input)
nutrition = (nutrition + input) //It handles the metroid's nutrition gain from melee.
@@ -1171,7 +1168,7 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
/mob/living/simple_animal/hostile/metroid/combat/DoPunch(var/mob/living/L) //Metroid actions vs the player.
var/damage_to_do = rand(melee_damage_lower, melee_damage_upper)
var/armor_modifier = abs((L.getarmor(null, "bio") / 100) - 1)
if(!Adjacent(L)) // Might've moved away in the meantime.
return
@@ -1187,12 +1184,12 @@ var/global/list/queen_amount = 0 //We only gonna want 1 queen in the world.
if(I_HURT) //The metroid does this if it can't latch onto the target or it decides not to try knocking them down.
ai_log("DoPunch() against [L], hurting.",2)
L.attack_generic(src, damage_to_do, pick(attacktext))
playsound(src, 'sound/weapons/bite.ogg', 75, 1)
// Give the Metroid some nutrition, if applicable, even if not attached.
if(!L.isSynthetic())
if(ishuman(L))
@@ -34,9 +34,9 @@
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"
response_help = "pets"
response_disarm = "bops"
response_harm = "hits"
attacktext = list("mauled")
friendly = list("nuzzles", "slobberlicks", "noses softly at", "noseboops", "headbumps against", "leans on", "nibbles affectionately on")
meat_amount = 6
@@ -25,9 +25,9 @@
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"
response_help = "pets"
response_disarm = "bops"
response_harm = "hits"
attacktext = list("ravaged")
friendly = list("nuzzles", "licks", "noses softly at", "noseboops", "headbumps against", "leans on", "nibbles affectionately on")
@@ -12,9 +12,9 @@
maxHealth = 30
health = 30
response_help = "pats the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
response_help = "pats"
response_disarm = "gently pushes aside"
response_harm = "hits"
harm_intent_damage = 5
melee_damage_lower = 5
@@ -56,3 +56,40 @@
health = 100
melee_damage_lower = 10
melee_damage_upper = 20
/mob/living/simple_animal/redpanda/alt
icon = 'icons/mob/vore48x48.dmi'
icon_state = "wah_alt"
icon_living = "wah_alt"
icon_dead = "wah_alt_dead"
pixel_x = -7
/mob/living/simple_animal/redpanda/alt/waaah
name = "waaah"
desc = "It's a waaah! Waaaaaaaaaah!"
tt_desc = "Ailurus waaahius"
icon_state = "wah_altwaaah"
icon_living = "wah_altwaaah"
icon_dead = "wah_altwaaah_dead"
maxHealth = 150
health = 150
response_help = "pats"
response_disarm = "gently pushes aside"
response_harm = "hits"
harm_intent_damage = 5
melee_damage_lower = 5
melee_damage_upper = 2
attacktext = list("bapped rapidly!")
turns_per_move = 1
speak_chance = 25
speak = list("Waaah!",
"Waaah?",
"Waaaaaaaaaah!")
emote_hear = list("wahs!","wahs even more!")
emote_see = list("trundles around wahing","rears up onto their hind legs and wahs at everyone!")
@@ -0,0 +1,203 @@
/mob/living/simple_animal/shadekin/initialize()
var/list/ability_types = subtypesof(/obj/effect/shadekin_ability)
if(name == "Rakshasa")
ability_types += subtypesof(/obj/effect/rakshasa_ability)
shadekin_abilities = list()
for(var/type in ability_types)
shadekin_abilities += new type(src)
update_icon()
return ..()
/obj/effect/rakshasa_ability
name = ""
desc = ""
icon = 'icons/mob/screen_spells.dmi'
var/ability_name = "FIX ME"
var/cost = 50
var/mob/living/simple_animal/shadekin/my_kin
var/shift_mode = NOT_WHILE_SHIFTED
var/ab_sound
/obj/effect/rakshasa_ability/New(var/new_kin)
..()
my_kin = new_kin
loc = null
/obj/effect/rakshasa_ability/Destroy()
my_kin = null
return ..()
/obj/effect/rakshasa_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/rakshasa_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/rakshasa_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/rakshasa_ability/phase_shift2
ability_name = "Goo Shift"
desc = "Shift yourself with goopy effects."
icon_state = "tech_passwall"
cost = 100
shift_mode = SHIFTED_OR_NOT
ab_sound = 'sound/effects/stealthoff.ogg'
/obj/effect/rakshasa_ability/phase_shift2/do_ability()
if(!..())
return
new /obj/effect/decal/cleanable/blood/oil(loc, src)
playsound(src, 'sound/rakshasa/Corrosion1.ogg', 100, 1)
my_kin.phase_shift()
if(my_kin.ability_flags & AB_PHASE_SHIFTED)
cost = 0 //Shifting back is free (but harmful in light)
new /obj/effect/decal/cleanable/blood/oil(my_kin.loc)
var/goo_sounds = list (
'sound/rakshasa/Decay1.ogg',
'sound/rakshasa/Decay2.ogg',
'sound/rakshasa/Decay3.ogg'
)
var/sound = pick(goo_sounds)
playsound(my_kin.loc, sound, 100, 1)
else
cost = initial(cost)
new /obj/effect/decal/cleanable/blood/oil(my_kin.loc)
playsound(my_kin.loc, 'sound/rakshasa/Emerge0.ogg', 100, 1)
/////////////////////////////////////////////////////////////////
/obj/effect/rakshasa_ability/phase_shift3
ability_name = "Goo Shift No Emerge"
desc = "Shift yourself with goopy effects."
icon_state = "tech_passwall"
cost = 100
shift_mode = SHIFTED_OR_NOT
ab_sound = 'sound/effects/stealthoff.ogg'
/obj/effect/rakshasa_ability/phase_shift3/do_ability()
if(!..())
return
new /obj/effect/decal/cleanable/blood/oil(loc, src)
playsound(src, 'sound/rakshasa/Corrosion1.ogg', 100, 1)
my_kin.phase_shift()
if(my_kin.ability_flags & AB_PHASE_SHIFTED)
cost = 0 //Shifting back is free (but harmful in light)
new /obj/effect/decal/cleanable/blood/oil(my_kin.loc)
var/goo_sounds = list (
'sound/rakshasa/Decay1.ogg',
'sound/rakshasa/Decay2.ogg',
'sound/rakshasa/Decay3.ogg'
)
var/sound = pick(goo_sounds)
playsound(my_kin.loc, sound, 100, 1)
else
cost = initial(cost)
new /obj/effect/decal/cleanable/blood/oil(my_kin.loc)
var/goo_sounds = list (
'sound/rakshasa/Decay1.ogg',
'sound/rakshasa/Decay2.ogg',
'sound/rakshasa/Decay3.ogg'
)
var/sound = pick(goo_sounds)
playsound(my_kin.loc, sound, 100, 1)
/////////////////////////////////////////////////////////////////
/obj/effect/rakshasa_ability/drip_oil
ability_name = "Goo Drip"
desc = "Drip some goo."
icon_state = ""
cost = 0
shift_mode = SHIFTED_OR_NOT
ab_sound = 'sound/effects/stealthoff.ogg'
/obj/effect/rakshasa_ability/drip_oil/do_ability()
if(!..())
return
new /obj/effect/decal/cleanable/blood/oil(my_kin.loc)
var/goo_sounds = list (
'sound/rakshasa/Decay1.ogg',
'sound/rakshasa/Decay2.ogg',
'sound/rakshasa/Decay3.ogg'
)
var/sound = pick(goo_sounds)
playsound(my_kin.loc, sound, 100, 1)
/////////////////////////////////////////////////////////////////
/obj/effect/rakshasa_ability/laugh
ability_name = "Laugh"
desc = "Laugh."
icon_state = ""
cost = 0
shift_mode = SHIFTED_OR_NOT
ab_sound = 'sound/effects/stealthoff.ogg'
/obj/effect/rakshasa_ability/laugh/do_ability()
if(!..())
return
playsound(my_kin.loc, 'sound/rakshasa/Laugh.ogg', 100, 1)
/////////////////////////////////////////////////////////////////
/obj/effect/rakshasa_ability/no
ability_name = "Say No"
desc = "Say no!"
icon_state = ""
cost = 0
shift_mode = SHIFTED_OR_NOT
ab_sound = 'sound/effects/stealthoff.ogg'
/obj/effect/rakshasa_ability/no/do_ability()
if(!..())
return
playsound(my_kin.loc, 'sound/rakshasa/No.ogg', 100, 1)
/////////////////////////////////////////////////////////////////
/obj/effect/rakshasa_ability/trap
ability_name = "Lay Trap"
desc = "Lay a trap that will notify you when someone steps in it."
icon_state = ""
cost = 0
shift_mode = SHIFTED_OR_NOT
ab_sound = 'sound/effects/stealthoff.ogg'
/obj/effect/rakshasa_ability/trap/do_ability()
if(!..())
return
var/goo_sounds = list (
'sound/rakshasa/Corrosion1.ogg',
'sound/rakshasa/Corrosion2.ogg',
'sound/rakshasa/Corrosion3.ogg'
)
var/sound = pick(goo_sounds)
playsound(my_kin.loc, sound, 100, 1)
new /obj/structure/gootrap (my_kin.loc)
@@ -0,0 +1,76 @@
/obj/structure/gootrap
name = "goo"
throw_speed = 2
throw_range = 1
gender = PLURAL
icon = 'icons/effects/blood.dmi'
var/base_icon = 'icons/effects/blood.dmi'
icon_state = "mfloor1"
var/basecolor="#030303"
desc = ""
throwforce = 0
w_class = ITEMSIZE_NORMAL
matter = list(DEFAULT_WALL_MATERIAL = 18750)
var/deployed = 1
anchored = 1
/obj/structure/gootrap/proc/can_use(mob/user)
return (user.IsAdvancedToolUser() && !issilicon(user) && !user.stat && !user.restrained())
/obj/structure/gootrap/update_icon()
..()
color = basecolor
/obj/structure/gootrap/New()
..()
update_icon()
return
/obj/structure/gootrap/attack_hand(mob/user as mob)
if(has_buckled_mobs() && can_use(user))
var/victim = english_list(buckled_mobs)
user.visible_message(
"<span class='notice'>[user] begins freeing [victim] from \the [src].</span>",
"<span class='notice'>You carefully begin to free [victim] from \the [src].</span>",
)
if(do_after(user, 5))
user.visible_message("<span class='notice'>[victim] has been freed from \the [src] by [user].</span>")
for(var/A in buckled_mobs)
unbuckle_mob(A)
anchored = 0
else
..()
/obj/structure/gootrap/proc/attack_mob(mob/living/L)
//trap the victim in place
set_dir(L.dir)
can_buckle = 1
buckle_mob(L)
var/goo_sounds = list (
'sound/rakshasa/Decay1.ogg',
'sound/rakshasa/Decay2.ogg',
'sound/rakshasa/Decay3.ogg'
)
var/sound = pick(goo_sounds)
playsound(src, sound, 100, 1)
L << "<span class='danger'>You hear a gooey schlorp as \the [src] ensnares your leg, trapping you in place!</span>"
deployed = 0
can_buckle = initial(can_buckle)
/obj/structure/gootrap/Crossed(AM as mob|obj)
if(deployed && isliving(AM))
var/mob/living/L = AM
if(L.m_intent == "run")
L.visible_message(
"<span class='danger'>[L] steps on \the [src].</span>",
"<span class='danger'>You step on \the [src]!</span>",
"<b>You hear a gooey schlorp as the goo ensnares your leg!</b>"
)
attack_mob(L)
if(!has_buckled_mobs())
anchored = 0
deployed = 0
message_admins("[key_name(usr)] has stepped in the goo trap.")
..()
@@ -43,9 +43,9 @@
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"
response_help = "pets"
response_disarm = "bops"
response_harm = "hits"
attacktext = list("mauled","slashed","clawed")
friendly = list("boops", "pawbs", "mars softly at", "sniffs on")
reactions = list("Mar?" = "Marrr!", "Mar!" = "Marrr???", "Mar." = "Marrr.")
@@ -52,6 +52,24 @@
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_TORSO,BP_HEAD)
athena_panels
name = "Hephaestus - Athena FBP Panels"
icon_state = "athena_p"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD)
athena_panels_body
name = "Hephaestus - Athena FBP Panels (body)"
icon_state = "athena_p"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO)
athena_panels_head
name = "Hephaestus - Athena FBP Panels (head)"
icon_state = "athena_p"
color_blend_mode = ICON_MULTIPLY
body_parts = list(BP_HEAD)
rook_lights
name = "Bishop - Rook lights"
icon_state = "rook-l"
@@ -103,3 +103,44 @@
chloral spawn_reagent = "chloralhydrate"
cryoxadone spawn_reagent = "cryoxadone"
clonexadone spawn_reagent = "clonexadone"
// Chems that are used but not meant for cargo supplies, at least for now.
champagne spawn_reagent = "champagne"
grapesoda spawn_reagent = "grapesoda"
singulo spawn_reagent = "singulo"
doctorsdelight spawn_reagent = "doctorsdelight"
nothing spawn_reagent = "nothing"
banana spawn_reagent = "banana"
honey spawn_reagent = "honey"
egg spawn_reagent = "egg"
coco spawn_reagent = "coco"
cherryjelly spawn_reagent = "cherryjelly"
carrot spawn_reagent = "carrot"
apple spawn_reagent = "apple"
tomato spawn_reagent = "tomato"
nutbutter spawn_reagent = "nutbutter" //ha
soymilk spawn_reagent = "soymilk"
grenadine spawn_reagent = "grenadine"
gingerale spawn_reagent = "gingerale"
royrogers spawn_reagent = "royrogers"
patron spawn_reagent = "patron"
goldschlager spawn_reagent = "goldschlager"
gelatin spawn_reagent = "gelatin"
melonliquor spawn_reagent = "melonliquor"
bluecuracao spawn_reagent = "bluecuracao"
thirteenloko spawn_reagent = "thirteenloko"
deadrum spawn_reagent = "deadrum"
sake spawn_reagent = "sake"
acidspit spawn_reagent = "acidspit"
amasec spawn_reagent = "amasec"
beepsky_smash spawn_reagent = "beepsky_smash"
atomicbomb spawn_reagent = "atomicbomb"
nuka_cola spawn_reagent = "nuka_cola"
threemileisland spawn_reagent = "threemileisland"
manhattan_proj spawn_reagent = "manhattan_proj"
psilocybin spawn_reagent = "psilocybin"
moonshine spawn_reagent = "moonshine"
specialwhiskey spawn_reagent = "specialwhiskey"
unathiliquor spawn_reagent = "unathiliquor"
winebrandy spawn_reagent = "winebrandy"
snaps spawn_reagent = "snaps"
@@ -157,3 +157,14 @@
reagent_volumes[reagent_ids[mode]] -= t
user << "<span class='notice'>You transfer [t] units of the solution to [target].</span>"
return
/obj/item/weapon/reagent_containers/borghypo/service/booze
name = "cyborg drink synthesizer"
desc = "A portable drink dispencer."
icon = 'icons/obj/drinks.dmi'
icon_state = "shaker"
charge_cost = 20
recharge_time = 3
volume = 120
possible_transfer_amounts = list(1 ,5, 10, 20, 30)
reagent_ids = list("ale", "beer", "berryjuice", "blood", "bitters", "cherryjelly", "coffee", "cognac", "cola", "demonsblood", "dr_gibb","eggnog", "gin", "gingerale", "hot_coco", "honey", "highpower", "ice", "icetea", "kahlua", "lemonjuice", "lemon_lime", "limejuice", "mead", "milk", "mint", "orangejuice", "gargleblaster", "phoronspecial", "rum", "sake", "sodawater", "soymilk", "space_up", "spacemountainwind", "specialwhiskey", "sugar", "sitonmyface", "spiderdrink", "syndicatebomb", "tea", "tequilla", "tomatojuice", "tonic", "vermouth", "vodka", "virginsip", "water", "watermelonjuice", "whiskey", "wine")
@@ -150,11 +150,20 @@
name = "Wolf (Taur)"
icon_state = "wolf_s"
suit_sprites = 'icons/mob/taursuits_wolf_vr.dmi'
/datum/sprite_accessory/tail/taur/fatwolf
name = "Fat Wolf (Taur)"
icon_state = "fatwolf_s"
/datum/sprite_accessory/tail/taur/wolf/wolf_2c
name = "Wolf dual-color (Taur)"
icon_state = "wolf_s"
extra_overlay = "wolf_markings"
/datum/sprite_accessory/tail/taur/wolf/fatwolf_2c
name = "Fat Wolf dual-color (Taur)"
icon_state = "fatwolf_s"
extra_overlay = "fatwolf_markings"
/datum/sprite_accessory/tail/taur/wolf/synthwolf
name = "SynthWolf dual-color (Taur)"
@@ -327,16 +336,30 @@
name = "Feline (Taur)"
icon_state = "feline_s"
/datum/sprite_accessory/tail/taur/fatfeline
name = "Fat Feline (Taur)"
icon_state = "fatfeline_s"
/datum/sprite_accessory/tail/taur/feline_wag
name = "Feline (Taur) (vwag)"
icon_state = "feline_s"
ani_state = "feline_w"
/datum/sprite_accessory/tail/taur/fatfeline_wag
name = "Fat Feline (Taur) (vwag)"
icon_state = "fatfeline_s"
ani_state = "fatfeline_w"
/datum/sprite_accessory/tail/taur/feline/feline_2c
name = "Feline dual-color (Taur)"
icon_state = "feline_s"
extra_overlay = "feline_markings"
/datum/sprite_accessory/tail/taur/feline/fatfeline_2c
name = "Fat Feline dual-color (Taur)"
icon_state = "fatfeline_s"
extra_overlay = "fatfeline_markings"
/datum/sprite_accessory/tail/taur/feline/feline_spots
name = "Feline spots (Taur)"
icon_state = "feline_s"
+2 -2
View File
@@ -60,7 +60,7 @@
//Numbing flag
if(mode_flags & DM_FLAG_NUMBING)
if(H.bloodstr.get_reagent_amount("numbenzyme") < 2)
if(H.bloodstr.get_reagent_amount("numbenzyme") < 2 && !H.synthetic)
H.bloodstr.add_reagent("numbenzyme",4)
//Stripping flag
@@ -184,7 +184,7 @@
if(M.absorbed && owner.nutrition >= 100)
M.absorbed = 0
to_chat(M,"<span class='notice'>You suddenly feel solid again </span>")
to_chat(M,"<span class='notice'>You suddenly feel solid again.</span>")
to_chat(owner,"<span class='notice'>You feel like a part of you is missing.</span>")
owner.nutrition -= 100
to_update = TRUE
+3 -2
View File
@@ -25,8 +25,9 @@ var/image/gurgled_overlay = image('icons/effects/sludgeoverlay_vr.dmi')
/obj/item/proc/can_gurgle()
if(flags & PHORONGUARD)
return FALSE
else if(phoronproof == TRUE)
return FALSE
//TFF 2/8/19 - removed to prevent contamination damage.
// else if(phoronproof == TRUE)
// return FALSE
else if(unacidable)
return FALSE
else
+10 -2
View File
@@ -384,8 +384,16 @@
belly = pred.vore_selected
return perform_the_nom(user, prey, pred, belly)
/mob/living/proc/feed_self_to_grabbed(var/mob/living/user, var/mob/living/pred)
var/belly = input("Choose Belly") in pred.vore_organs
/mob/living/proc/feed_self_to_grabbed(var/mob/living/user, var/mob/living/pred, var/belly, var/list/bellys)
//CHOMPEDIT: AUTO BELLY SELECTOR
if (!user.client)
for(var/obj/belly/guttoviolate in pred.vore_organs)
if(guttoviolate.name == "fstomach")
bellys |= guttoviolate
if(!bellys)return
belly = pick(bellys)
//CHOMPEDIT: END
else belly = input("Choose Belly") in pred.vore_organs
return perform_the_nom(user, user, pred, belly)
/mob/living/proc/feed_grabbed_to_other(var/mob/living/user, var/mob/living/prey, var/mob/living/pred)
+4 -1
View File
@@ -812,8 +812,9 @@
user.client.prefs_vr.digestable = user.digestable
//TFF 30/4/19: Ports VoreStation Remains Option - add option that goes paw in paw with belly setting; allow yourself to leave bones behind after you're digested
//TFF 2/8/19 - Add admin message notification for setting this ON.
if(href_list["toggledlm"])
var/choice = alert(user, "This button allows preds to have your remains be left in their belly after you are digested. This will only happen if pred sets their belly to do so. Remains consist of skeletal parts. Currently you are [user.digest_leave_remains? "" : "not"] leaving remains.", "", "Allow Post-digestion Remains", "Cancel", "Disallow Post-digestion Remains")
var/choice = alert(user, "This button allows preds to have your remains be left in their belly after you are digested. This will only happen if pred sets their belly to do so. Remains consist of skeletal parts. Setting this will notify admins. Currently you are [user.digest_leave_remains? "" : "not"] leaving remains.", "", "Allow Post-digestion Remains", "Cancel", "Disallow Post-digestion Remains")
switch(choice)
if("Cancel")
return 0
@@ -822,6 +823,8 @@
if("Disallow Post-digestion Remains")
user.digest_leave_remains = FALSE
message_admins("[key_name(user)] toggled their ability to leave remains to [user.digest_leave_remains] ([user ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[user.loc.];Y=[user.loc.y];Z=[user.loc.z]'>JMP</a>" : "null"])")
if(user.client.prefs_vr)
user.client.prefs_vr.digest_leave_remains = user.digest_leave_remains