initial commit - Straight pull from Virgo's master branch from 5/6/2018 at 6:00 PM EST

This commit is contained in:
deathride58
2018-05-06 19:05:49 -04:00
commit f1893fa0a0
5685 changed files with 1281838 additions and 0 deletions
+323
View File
@@ -0,0 +1,323 @@
var/global/list/datum/supply_drop_loot/supply_drop
/proc/supply_drop_random_loot_types()
if(!supply_drop)
supply_drop = init_subtypes(/datum/supply_drop_loot)
supply_drop = dd_sortedObjectList(supply_drop)
return supply_drop
/datum/supply_drop_loot
var/name = ""
var/container = null
var/list/contents = null
/datum/supply_drop_loot/proc/contents()
return contents
/datum/supply_drop_loot/proc/drop(turf/T)
var/C = container ? new container(T) : T
for(var/content in contents())
new content(C)
/datum/supply_drop_loot/dd_SortValue()
return name
/datum/supply_drop_loot/lasers
name = "Laser Warfare"
container = /obj/structure/largecrate
/datum/supply_drop_loot/lasers/New()
..()
contents = list(
/obj/item/clothing/gloves/arm_guard/laserproof,
/obj/item/clothing/shoes/leg_guard/laserproof,
/obj/item/clothing/head/helmet/laserproof,
/obj/item/clothing/suit/armor/laserproof,
/obj/item/clothing/glasses/sunglasses/sechud/tactical,
/obj/item/weapon/storage/belt/security/tactical/bandolier,
/obj/item/clothing/accessory/storage/black_drop_pouches,
/obj/item/weapon/storage/backpack/dufflebag/sec,
/obj/item/weapon/shield/energy,
/obj/item/weapon/gun/energy/ionrifle,
/obj/item/weapon/gun/energy/xray,
/obj/item/weapon/storage/box/emps,
/obj/item/weapon/storage/box/flashbangs,
/obj/item/weapon/material/knife/tacknife/combatknife)
/datum/supply_drop_loot/ballistics
name = "Ballistic Warfare"
container = /obj/structure/largecrate
/datum/supply_drop_loot/ballistics/New()
..()
contents = list(
/obj/item/clothing/head/helmet/bulletproof,
/obj/item/clothing/suit/armor/bulletproof,
/obj/item/clothing/gloves/arm_guard/bulletproof,
/obj/item/clothing/shoes/leg_guard/bulletproof,
/obj/item/clothing/glasses/sunglasses/sechud/tactical,
/obj/item/weapon/storage/belt/security/tactical/bandolier,
/obj/item/clothing/accessory/storage/black_drop_pouches,
/obj/item/weapon/storage/backpack/dufflebag/sec,
/obj/item/weapon/shield/riot/tele,
/obj/item/weapon/storage/box/emps,
/obj/item/weapon/storage/box/flashbangs,
/obj/item/weapon/gun/projectile/automatic/sts35,
/obj/item/ammo_magazine/m762/ap,
/obj/item/ammo_magazine/m762/ap,
/obj/item/weapon/gun/projectile/colt,
/obj/item/ammo_magazine/m45,
/obj/item/weapon/material/knife/tacknife/combatknife)
/datum/supply_drop_loot/heavy_warfare
name = "Heavy Warfare"
container = /obj/structure/largecrate
/datum/supply_drop_loot/heavy_warfare/New()
..()
contents = list(
/obj/item/clothing/head/helmet/combat,
/obj/item/clothing/suit/armor/combat,
/obj/item/clothing/gloves/arm_guard/combat,
/obj/item/clothing/shoes/leg_guard/combat,
/obj/item/clothing/glasses/sunglasses/sechud/tactical,
/obj/item/weapon/storage/belt/security/tactical/bandolier,
/obj/item/clothing/accessory/storage/black_drop_pouches,
/obj/item/weapon/storage/backpack/dufflebag/sec,
/obj/item/weapon/gun/projectile/automatic/bullpup,
/obj/item/ammo_magazine/m762/ap,
/obj/item/ammo_magazine/m762,
/obj/item/weapon/shield/energy,
/obj/item/weapon/grenade/explosive/frag,
/obj/item/weapon/grenade/explosive/frag,
/obj/item/weapon/grenade/smokebomb,
/obj/item/weapon/grenade/smokebomb,
/obj/item/weapon/grenade/flashbang,
/obj/item/weapon/grenade/flashbang,
/obj/item/weapon/grenade/empgrenade,
/obj/item/weapon/grenade/empgrenade,
/obj/item/weapon/material/knife/tacknife/combatknife)
datum/supply_drop_loot/riot
name = "Riot Gear"
container = /obj/structure/largecrate
/datum/supply_drop_loot/riot/New()
..()
contents = list(
/obj/item/clothing/head/helmet/riot,
/obj/item/clothing/suit/armor/riot,
/obj/item/clothing/gloves/arm_guard/riot,
/obj/item/clothing/shoes/leg_guard/riot,
/obj/item/weapon/shield/riot/tele,
/obj/item/weapon/storage/box/flashbangs,
/obj/item/weapon/storage/box/handcuffs,
/obj/item/weapon/melee/baton,
/obj/item/clothing/glasses/sunglasses/sechud/tactical,
/obj/item/weapon/storage/belt/security,
/obj/item/clothing/shoes/boots/jackboots,
/obj/item/clothing/gloves/black,
/obj/item/weapon/gun/projectile/shotgun/pump,
/obj/item/weapon/gun/energy/gun,
/obj/item/clothing/accessory/holster,
/obj/item/weapon/gun/launcher/grenade,
/obj/item/weapon/storage/backpack/dufflebag/sec)
/datum/supply_drop_loot/seeds
name = "Plant Growing"
container = /obj/structure/closet/crate
/datum/supply_drop_loot/seeds/New()
..()
contents = list(
/obj/item/seeds/chiliseed,
/obj/item/seeds/icepepperseed,
/obj/item/seeds/berryseed,
/obj/item/seeds/cornseed,
/obj/item/seeds/eggplantseed,
/obj/item/seeds/tomatoseed,
/obj/item/seeds/appleseed,
/obj/item/seeds/soyaseed,
/obj/item/seeds/wheatseed,
/obj/item/seeds/carrotseed,
/obj/item/seeds/lemonseed,
/obj/item/seeds/limeseed,
/obj/item/seeds/orangeseed,
/obj/item/seeds/grassseed,
/obj/item/seeds/sunflowerseed,
/obj/item/seeds/chantermycelium,
/obj/item/seeds/potatoseed,
/obj/item/seeds/sugarcaneseed,
/obj/item/seeds/plastiseed,
/obj/item/seeds/grapeseed,
/obj/item/seeds/greengrapeseed,
/obj/item/seeds/peanutseed,
/obj/item/seeds/cabbageseed,
/obj/item/seeds/bananaseed,
/obj/item/seeds/poppyseed,
/obj/item/seeds/riceseed,
/obj/item/seeds/plumpmycelium,
/obj/item/seeds/lavenderseed,
/obj/item/seeds/whitebeetseed,
/obj/item/seeds/sugarcaneseed,
/obj/item/seeds/watermelonseed,
/obj/item/seeds/cherryseed,
/obj/item/weapon/reagent_containers/glass/bottle/eznutrient,
/obj/item/weapon/reagent_containers/glass/bottle/eznutrient,
/obj/item/weapon/reagent_containers/glass/bottle/eznutrient,
/obj/item/weapon/reagent_containers/glass/bottle/eznutrient,
/obj/item/weapon/reagent_containers/glass/bottle/eznutrient,
/obj/item/weapon/reagent_containers/glass/bottle/eznutrient,
/obj/machinery/portable_atmospherics/hydroponics,
/obj/machinery/portable_atmospherics/hydroponics,
/obj/machinery/portable_atmospherics/hydroponics,
/obj/machinery/portable_atmospherics/hydroponics,
/obj/machinery/portable_atmospherics/hydroponics,
/obj/machinery/portable_atmospherics/hydroponics,
/obj/structure/reagent_dispensers/watertank,
/obj/item/weapon/reagent_containers/glass/bucket,
/obj/item/weapon/reagent_containers/glass/bucket)
/datum/supply_drop_loot/food
name = "Emergency Provisions For Two"
container = /obj/structure/largecrate
/datum/supply_drop_loot/food/New()
..()
contents = list(
/obj/item/weapon/reagent_containers/food/snacks/liquidfood,
/obj/item/weapon/reagent_containers/food/snacks/liquidfood,
/obj/item/weapon/reagent_containers/food/snacks/liquidfood,
/obj/item/weapon/reagent_containers/food/snacks/liquidfood,
/obj/item/weapon/reagent_containers/food/snacks/liquidfood,
/obj/item/weapon/reagent_containers/food/snacks/liquidfood,
/obj/item/weapon/reagent_containers/food/snacks/tastybread,
/obj/item/weapon/reagent_containers/food/snacks/tastybread,
/obj/item/weapon/reagent_containers/food/snacks/tastybread,
/obj/item/weapon/reagent_containers/food/snacks/tastybread,
/obj/item/weapon/reagent_containers/food/snacks/tastybread,
/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/proteinshake,
/obj/item/weapon/reagent_containers/food/drinks/glass2/fitnessflask/proteinshake,
/obj/item/weapon/crowbar,
/obj/item/weapon/crowbar,
/obj/item/device/flashlight,
/obj/item/device/flashlight,
/obj/item/clothing/suit/storage/hazardvest,
/obj/item/clothing/suit/storage/hazardvest,
/obj/item/device/flashlight/flare,
/obj/item/device/flashlight/flare)
/datum/supply_drop_loot/plushie
name = "Cuddly Fun!"
container = /obj/structure/largecrate
/datum/supply_drop_loot/plushie/New()
..()
contents = list(
/obj/structure/plushie/drone,
/obj/structure/plushie/carp,
/obj/structure/plushie/beepsky,
/obj/item/toy/plushie/nymph,
/obj/item/toy/plushie/mouse,
/obj/item/toy/plushie/kitten,
/obj/item/toy/plushie/lizard,
/obj/random/action_figure,
/obj/random/action_figure,
/obj/random/action_figure,
/obj/random/action_figure,
/obj/random/action_figure,
/obj/random/action_figure,
/obj/item/toy/nanotrasenballoon,
/obj/item/toy/syndicateballoon,
/obj/item/toy/sword,
/obj/item/toy/sword,
/obj/item/toy/sword,
/obj/item/toy/sword,
/obj/item/toy/katana,
/obj/item/toy/katana,
/obj/item/weapon/inflatable_duck,
/obj/item/weapon/inflatable_duck)
/datum/supply_drop_loot/christmas
name = "Surplus Christmas Supplies"
container = /obj/structure/largecrate
/datum/supply_drop_loot/christmas/New()
..()
contents = list(
/obj/structure/flora/pottedplant/xmas,
/obj/structure/flora/pottedplant/xmas,
/obj/structure/flora/pottedplant/xmas,
/obj/structure/flora/pottedplant/xmas,
/obj/structure/flora/pottedplant/xmas,
/obj/structure/flora/pottedplant/xmas,
/obj/structure/flora/pottedplant/xmas,
/obj/structure/flora/pottedplant/xmas,
/obj/item/clothing/head/santa,
/obj/item/clothing/head/santa,
/obj/item/clothing/head/santa,
/obj/item/clothing/head/santa,
/obj/item/clothing/head/santa/green,
/obj/item/clothing/head/santa/green,
/obj/item/clothing/head/santa/green,
/obj/item/clothing/head/santa/green,
/obj/item/clothing/accessory/scarf/christmas,
/obj/item/clothing/accessory/scarf/christmas,
/obj/item/clothing/accessory/scarf/christmas,
/obj/item/clothing/accessory/scarf/christmas
)
/datum/supply_drop_loot/materials
name = "Materials"
container = /obj/structure/largecrate
/datum/supply_drop_loot/materials/New()
..()
contents = list(
/obj/fiftyspawner/steel,
/obj/fiftyspawner/steel,
/obj/fiftyspawner/steel,
/obj/fiftyspawner/glass,
/obj/fiftyspawner/glass,
/obj/fiftyspawner/wood,
/obj/fiftyspawner/plastic,
/obj/fiftyspawner/rglass,
/obj/fiftyspawner/plasteel)
/datum/supply_drop_loot/materials_advanced
name = "Advanced Materials"
container = /obj/structure/largecrate
/datum/supply_drop_loot/materials_advanced/New()
..()
contents = list(
/obj/fiftyspawner/steel,
/obj/fiftyspawner/glass,
/obj/fiftyspawner/wood,
/obj/fiftyspawner/plastic,
/obj/fiftyspawner/rglass,
/obj/fiftyspawner/plasteel,
/obj/fiftyspawner/diamond,
/obj/fiftyspawner/phoron,
/obj/fiftyspawner/gold,
/obj/fiftyspawner/silver,
/obj/fiftyspawner/platinum,
/obj/fiftyspawner/mhydrogen,
/obj/fiftyspawner/tritium,
/obj/fiftyspawner/osmium,)
/datum/supply_drop_loot/supermatter
name = "Supermatter"
/datum/supply_drop_loot/supermatter/New()
..()
contents = list(/obj/machinery/power/supermatter)
/datum/supply_drop_loot/medical
name = "Medical"
container = /obj/structure/closet/crate/medical
/datum/supply_drop_loot/medical/New()
..()
contents = list(
/obj/item/weapon/storage/firstaid/regular,
/obj/item/weapon/storage/firstaid/fire,
/obj/item/weapon/storage/firstaid/toxin,
/obj/item/weapon/storage/firstaid/o2,
/obj/item/weapon/storage/firstaid/adv,
/obj/item/weapon/storage/firstaid/combat,
/obj/item/weapon/reagent_containers/glass/bottle/antitoxin,
/obj/item/weapon/reagent_containers/glass/bottle/antitoxin,
/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,
/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,
/obj/item/weapon/storage/box/syringes,
/obj/item/weapon/storage/box/autoinjectors)
+227
View File
@@ -0,0 +1,227 @@
#define SD_FLOOR_TILE 0
#define SD_WALL_TILE 1
#define SD_DOOR_TILE 2
#define SD_EMPTY_TILE 3
#define SD_SUPPLY_TILE 7
/datum/random_map/droppod
descriptor = "drop pod"
initial_wall_cell = 0
limit_x = 3
limit_y = 3
preserve_map = 0
wall_type = /turf/simulated/wall/titanium
floor_type = /turf/simulated/floor/reinforced
var/list/supplied_drop_types = list()
var/door_type = /obj/structure/droppod_door
var/drop_type = /mob/living/simple_animal/parrot
var/auto_open_doors
var/placement_explosion_dev = 1
var/placement_explosion_heavy = 2
var/placement_explosion_light = 6
var/placement_explosion_flash = 4
/datum/random_map/droppod/New(var/seed, var/tx, var/ty, var/tz, var/tlx, var/tly, var/do_not_apply, var/do_not_announce, var/supplied_drop, var/list/supplied_drops, var/automated)
if(supplied_drop)
drop_type = supplied_drop
else if(islist(supplied_drops) && supplied_drops.len)
supplied_drop_types = supplied_drops
drop_type = "custom"
if(automated)
auto_open_doors = 1
//Make sure there is a clear midpoint.
if(limit_x % 2 == 0) limit_x++
if(limit_y % 2 == 0) limit_y++
..()
/datum/random_map/droppod/generate_map()
// No point calculating these 200 times.
var/x_midpoint = n_ceil(limit_x / 2)
var/y_midpoint = n_ceil(limit_y / 2)
// Draw walls/floors/doors.
for(var/x = 1, x <= limit_x, x++)
for(var/y = 1, y <= limit_y, y++)
var/current_cell = get_map_cell(x,y)
if(!current_cell)
continue
var/on_x_bound = (x == 1 || x == limit_x)
var/on_y_bound = (y == 1 || y == limit_x)
var/draw_corners = (limit_x < 5 && limit_y < 5)
if(on_x_bound || on_y_bound)
// Draw access points in midpoint of each wall.
if(x == x_midpoint || y == y_midpoint)
map[current_cell] = SD_DOOR_TILE
// Draw the actual walls.
else if(draw_corners || (!on_x_bound || !on_y_bound))
map[current_cell] = SD_WALL_TILE
//Don't draw the far corners on large pods.
else
map[current_cell] = SD_EMPTY_TILE
else
// Fill in the corners.
if((x == 2 || x == (limit_x-1)) && (y == 2 || y == (limit_y-1)))
map[current_cell] = SD_WALL_TILE
// Fill in EVERYTHING ELSE.
else
map[current_cell] = SD_FLOOR_TILE
// Draw the drop contents.
var/current_cell = get_map_cell(x_midpoint,y_midpoint)
if(current_cell)
map[current_cell] = SD_SUPPLY_TILE
return 1
/datum/random_map/droppod/apply_to_map()
if(placement_explosion_dev || placement_explosion_heavy || placement_explosion_light || placement_explosion_flash)
var/turf/T = locate((origin_x + n_ceil(limit_x / 2)-1), (origin_y + n_ceil(limit_y / 2)-1), origin_z)
if(istype(T))
explosion(T, placement_explosion_dev, placement_explosion_heavy, placement_explosion_light, placement_explosion_flash)
sleep(15) // Let the explosion finish proccing before we ChangeTurf(), otherwise it might destroy our spawned objects.
return ..()
/datum/random_map/droppod/get_appropriate_path(var/value)
if(value == SD_FLOOR_TILE || value == SD_SUPPLY_TILE)
return floor_type
else if(value == SD_WALL_TILE)
return wall_type
else if(value == SD_DOOR_TILE )
return wall_type
return null
// Pods are circular. Get the direction this object is facing from the center of the pod.
/datum/random_map/droppod/get_spawn_dir(var/x, var/y)
var/x_midpoint = n_ceil(limit_x / 2)
var/y_midpoint = n_ceil(limit_y / 2)
if(x == x_midpoint && y == y_midpoint)
return null
var/turf/target = locate(origin_x+x-1, origin_y+y-1, origin_z)
var/turf/middle = locate(origin_x+x_midpoint-1, origin_y+y_midpoint-1, origin_z)
if(!istype(target) || !istype(middle))
return null
return get_dir(middle, target)
/datum/random_map/droppod/get_additional_spawns(var/value, var/turf/T, var/spawn_dir)
// Splatter anything under us that survived the explosion.
if(value != SD_EMPTY_TILE && T.contents.len)
for(var/atom/movable/AM in T)
if(AM.simulated && !istype(AM, /mob/observer))
qdel(AM)
// Also spawn doors and loot.
if(value == SD_DOOR_TILE)
var/obj/structure/S = new door_type(T, auto_open_doors)
S.set_dir(spawn_dir)
else if(value == SD_SUPPLY_TILE)
get_spawned_drop(T)
/datum/random_map/droppod/proc/get_spawned_drop(var/turf/T)
var/obj/structure/bed/chair/C = new(T)
C.set_light(3, l_color = "#CC0000")
var/mob/living/drop
// This proc expects a list of mobs to be passed to the spawner.
// Use the supply pod if you don't want to drop mobs.
// Mobs will not double up; if you want multiple mobs, you
// will need multiple drop tiles.
if(islist(supplied_drop_types) && supplied_drop_types.len)
while(supplied_drop_types.len)
drop = pick(supplied_drop_types)
supplied_drop_types -= drop
if(istype(drop))
drop.tag = null
if(drop.buckled)
drop.buckled = null
drop.forceMove(T)
else if(ispath(drop_type))
drop = new drop_type(T)
if(istype(drop))
if(drop.buckled)
drop.buckled = null
drop.forceMove(T)
/datum/admins/proc/call_drop_pod()
set category = "Fun"
set desc = "Call an immediate drop pod on your location."
set name = "Call Drop Pod"
if(!check_rights(R_FUN)) return
var/client/selected_player
var/mob/living/spawned_mob
var/list/spawned_mobs = list()
var/spawn_path = input("Select a mob type.", "Drop Pod Selection", null) as null|anything in typesof(/mob/living)-/mob/living
if(!spawn_path)
return
if(alert("Do you wish the mob to have a player?",,"No","Yes") == "No")
var/spawn_count = input("How many mobs do you wish the pod to contain?", "Drop Pod Selection", null) as num
if(spawn_count <= 0)
return
for(var/i=0;i<spawn_count;i++)
var/mob/living/M = new spawn_path()
M.tag = "awaiting drop"
spawned_mobs |= M
else
var/list/candidates = list()
for(var/client/player in clients)
if(player.mob && istype(player.mob, /mob/observer/dead))
candidates |= player
if(!candidates.len)
usr << "There are no candidates for a drop pod launch."
return
// Get a player and a mob type.
selected_player = input("Select a player.", "Drop Pod Selection", null) as null|anything in candidates
if(!selected_player)
return
// Spawn the mob in nullspace for now.
spawned_mob = new spawn_path()
spawned_mob.tag = "awaiting drop"
// Equip them, if they are human and it is desirable.
if(istype(spawned_mob, /mob/living/carbon/human))
var/antag_type = input("Select an equipment template to use or cancel for nude.", null) as null|anything in all_antag_types
if(antag_type)
var/datum/antagonist/A = all_antag_types[antag_type]
A.equip(spawned_mob)
if(alert("Are you SURE you wish to deploy this drop pod? It will cause a sizable explosion and gib anyone underneath it.",,"No","Yes") == "No")
if(spawned_mob)
qdel(spawned_mob)
if(spawned_mobs.len)
for(var/mob/living/M in spawned_mobs)
spawned_mobs -= M
M.tag = null
qdel(M)
spawned_mobs.Cut()
return
// Chuck them into the pod.
var/automatic_pod
if(spawned_mob && selected_player)
if(selected_player.mob.mind)
selected_player.mob.mind.transfer_to(spawned_mob)
else
spawned_mob.ckey = selected_player.mob.ckey
spawned_mobs = list(spawned_mob)
message_admins("[key_name(usr)] dropped a pod containing \the [spawned_mob] ([spawned_mob.key]) at ([usr.x],[usr.y],[usr.z])")
log_admin("[key_name(usr)] dropped a pod containing \the [spawned_mob] ([spawned_mob.key]) at ([usr.x],[usr.y],[usr.z])")
else if(spawned_mobs.len)
automatic_pod = 1
message_admins("[key_name(usr)] dropped a pod containing [spawned_mobs.len] [spawned_mobs[1]] at ([usr.x],[usr.y],[usr.z])")
log_admin("[key_name(usr)] dropped a pod containing [spawned_mobs.len] [spawned_mobs[1]] at ([usr.x],[usr.y],[usr.z])")
else
return
new /datum/random_map/droppod(null, usr.x-1, usr.y-1, usr.z, supplied_drops = spawned_mobs, automated = automatic_pod)
@@ -0,0 +1,80 @@
/obj/structure/droppod_door
name = "pod door"
desc = "A drop pod door. Opens rapidly using explosive bolts."
icon = 'icons/obj/structures.dmi'
icon_state = "droppod_door_closed"
anchored = 1
density = 1
opacity = 1
layer = TURF_LAYER + 0.1
var/deploying
var/deployed
/obj/structure/droppod_door/New(var/newloc, var/autoopen)
..(newloc)
if(autoopen)
spawn(100)
deploy()
/obj/structure/droppod_door/attack_ai(var/mob/user)
if(!user.Adjacent(src))
return
attack_hand(user)
/obj/structure/droppod_door/attack_generic(var/mob/user)
attack_hand(user)
/obj/structure/droppod_door/attack_hand(var/mob/user)
if(deploying) return
user << "<span class='danger'>You prime the explosive bolts. Better get clear!</span>"
sleep(30)
deploy()
/obj/structure/droppod_door/proc/deploy()
if(deployed)
return
deployed = 1
visible_message("<span class='danger'>The explosive bolts on \the [src] detonate, throwing it open!</span>")
playsound(src.loc, 'sound/effects/bang.ogg', 50, 1, 5)
// This is shit but it will do for the sake of testing.
for(var/obj/structure/droppod_door/D in orange(1,src))
if(D.deployed)
continue
D.deploy()
// Overwrite turfs.
var/turf/origin = get_turf(src)
origin.ChangeTurf(/turf/simulated/floor/reinforced)
origin.set_light(0) // Forcing updates
var/turf/T = get_step(origin, src.dir)
T.ChangeTurf(/turf/simulated/floor/reinforced)
T.set_light(0) // Forcing updates
// Destroy turf contents.
for(var/obj/O in origin)
if(!O.simulated)
continue
qdel(O) //crunch
for(var/obj/O in T)
if(!O.simulated)
continue
qdel(O) //crunch
// Hurl the mobs away.
for(var/mob/living/M in T)
M.throw_at(get_edge_target_turf(T,src.dir),rand(0,3),50)
for(var/mob/living/M in origin)
M.throw_at(get_edge_target_turf(origin,src.dir),rand(0,3),50)
// Create a decorative ramp bottom and flatten out our current ramp.
density = 0
set_opacity(0)
icon_state = "ramptop"
var/obj/structure/droppod_door/door_bottom = new(T)
door_bottom.deployed = 1
door_bottom.density = 0
door_bottom.set_opacity(0)
door_bottom.dir = src.dir
door_bottom.icon_state = "rampbottom"
+93
View File
@@ -0,0 +1,93 @@
/datum/random_map/droppod/supply
descriptor = "supply drop"
limit_x = 5
limit_y = 5
placement_explosion_light = 7
placement_explosion_flash = 5
// UNLIKE THE DROP POD, this map deals ENTIRELY with strings and types.
// Drop type is a string representing a mode rather than an atom or path.
// supplied_drop_types is a list of types to spawn in the pod.
/datum/random_map/droppod/supply/get_spawned_drop(var/turf/T)
if(!drop_type) drop_type = pick(supply_drop_random_loot_types())
if(drop_type == "custom")
if(supplied_drop_types.len)
var/obj/structure/largecrate/C = locate() in T
for(var/drop_type in supplied_drop_types)
var/atom/movable/A = new drop_type(T)
if(!istype(A, /mob))
if(!C) C = new(T)
C.contents |= A
return
else
drop_type = pick(supply_drop_random_loot_types())
if(istype(drop_type, /datum/supply_drop_loot))
var/datum/supply_drop_loot/SDL = drop_type
SDL.drop(T)
else
error("Unhandled drop type: [drop_type]")
/datum/admins/proc/call_supply_drop()
set category = "Fun"
set desc = "Call an immediate supply drop on your location."
set name = "Call Supply Drop"
if(!check_rights(R_FUN)) return
var/chosen_loot_type
var/list/chosen_loot_types
var/choice = alert("Do you wish to supply a custom loot list?",,"No","Yes")
if(choice == "Yes")
chosen_loot_types = list()
choice = alert("Do you wish to add mobs?",,"No","Yes")
if(choice == "Yes")
while(1)
var/adding_loot_type = input("Select a new loot path. Cancel to finish.", "Loot Selection", null) as null|anything in typesof(/mob/living)
if(!adding_loot_type)
break
chosen_loot_types |= adding_loot_type
choice = alert("Do you wish to add structures or machines?",,"No","Yes")
if(choice == "Yes")
while(1)
var/adding_loot_type = input("Select a new loot path. Cancel to finish.", "Loot Selection", null) as null|anything in typesof(/obj) - typesof(/obj/item)
if(!adding_loot_type)
break
chosen_loot_types |= adding_loot_type
choice = alert("Do you wish to add any non-weapon items?",,"No","Yes")
if(choice == "Yes")
while(1)
var/adding_loot_type = input("Select a new loot path. Cancel to finish.", "Loot Selection", null) as null|anything in typesof(/obj/item) - typesof(/obj/item/weapon)
if(!adding_loot_type)
break
chosen_loot_types |= adding_loot_type
choice = alert("Do you wish to add weapons?",,"No","Yes")
if(choice == "Yes")
while(1)
var/adding_loot_type = input("Select a new loot path. Cancel to finish.", "Loot Selection", null) as null|anything in typesof(/obj/item/weapon)
if(!adding_loot_type)
break
chosen_loot_types |= adding_loot_type
choice = alert("Do you wish to add ABSOLUTELY ANYTHING ELSE? (you really shouldn't need to)",,"No","Yes")
if(choice == "Yes")
while(1)
var/adding_loot_type = input("Select a new loot path. Cancel to finish.", "Loot Selection", null) as null|anything in typesof(/atom/movable)
if(!adding_loot_type)
break
chosen_loot_types |= adding_loot_type
else
choice = alert("Do you wish to specify a loot type?",,"No","Yes")
if(choice == "Yes")
chosen_loot_type = input("Select a loot type.", "Loot Selection", null) as null|anything in supply_drop_random_loot_types()
choice = alert("Are you SURE you wish to deploy this supply drop? It will cause a sizable explosion and gib anyone underneath it.",,"No","Yes")
if(choice == "No")
return
log_admin("[key_name(usr)] dropped supplies at ([usr.x],[usr.y],[usr.z])")
new /datum/random_map/droppod/supply(null, usr.x-2, usr.y-2, usr.z, supplied_drops = chosen_loot_types, supplied_drop = chosen_loot_type)