mirror of
https://github.com/CHOMPstation/CHOMPstation.git
synced 2026-08-24 04:26:38 +01:00
fix and merge conflicting files
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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'
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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"
|
||||
@@ -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 won’t stop you. Just steer clear of _____.",
|
||||
"(Pick 2) Having problems with _____? Try _____!",
|
||||
"(Pick 2) After months of practice with _____, I think I’m finally ready for _____.",
|
||||
"Finally! A service that delivers _____ right to your door."
|
||||
|
||||
)
|
||||
@@ -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 doesn’t have a penis",
|
||||
"A man who surprisingly doesn’t 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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
+1288
-1285
File diff suppressed because it is too large
Load Diff
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user