mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-29 03:22:12 +00:00
More work on pods, added personnel pod.
This commit is contained in:
@@ -1502,6 +1502,8 @@
|
|||||||
#include "code\modules\random_map\automata\automata.dm"
|
#include "code\modules\random_map\automata\automata.dm"
|
||||||
#include "code\modules\random_map\automata\caves.dm"
|
#include "code\modules\random_map\automata\caves.dm"
|
||||||
#include "code\modules\random_map\building\building.dm"
|
#include "code\modules\random_map\building\building.dm"
|
||||||
|
#include "code\modules\random_map\drop\droppod.dm"
|
||||||
|
#include "code\modules\random_map\drop\droppod_doors.dm"
|
||||||
#include "code\modules\random_map\drop\supply.dm"
|
#include "code\modules\random_map\drop\supply.dm"
|
||||||
#include "code\modules\random_map\mazes\maze.dm"
|
#include "code\modules\random_map\mazes\maze.dm"
|
||||||
#include "code\modules\random_map\mazes\maze_cell.dm"
|
#include "code\modules\random_map\mazes\maze_cell.dm"
|
||||||
|
|||||||
@@ -115,8 +115,10 @@ var/list/admin_verbs_fun = list(
|
|||||||
/client/proc/toggle_random_events,
|
/client/proc/toggle_random_events,
|
||||||
/client/proc/editappear,
|
/client/proc/editappear,
|
||||||
/client/proc/roll_dices,
|
/client/proc/roll_dices,
|
||||||
/datum/admins/proc/call_supply_drop
|
/datum/admins/proc/call_supply_drop,
|
||||||
|
/datum/admins/proc/call_drop_pod
|
||||||
)
|
)
|
||||||
|
|
||||||
var/list/admin_verbs_spawn = list(
|
var/list/admin_verbs_spawn = list(
|
||||||
/datum/admins/proc/spawn_fruit,
|
/datum/admins/proc/spawn_fruit,
|
||||||
/datum/admins/proc/spawn_custom_item,
|
/datum/admins/proc/spawn_custom_item,
|
||||||
|
|||||||
245
code/modules/random_map/drop/droppod.dm
Normal file
245
code/modules/random_map/drop/droppod.dm
Normal file
@@ -0,0 +1,245 @@
|
|||||||
|
#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
|
||||||
|
var/global/list/supply_drop_random_loot_types = list(
|
||||||
|
"guns",
|
||||||
|
"seeds",
|
||||||
|
"materials",
|
||||||
|
"food",
|
||||||
|
"armour",
|
||||||
|
"medical",
|
||||||
|
"power",
|
||||||
|
"hydroponics",
|
||||||
|
"lasers",
|
||||||
|
"ballistics"
|
||||||
|
)
|
||||||
|
|
||||||
|
/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/voxshuttle
|
||||||
|
floor_type = /turf/simulated/floor/engine
|
||||||
|
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 = 2
|
||||||
|
var/placement_explosion_heavy = 4
|
||||||
|
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(5) // Let the explosion finish proccing before we ChangeTurf(), otherwise it might destroy our spawned objects.
|
||||||
|
sleep(-1)
|
||||||
|
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
|
||||||
|
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/A in T)
|
||||||
|
if(!A.simulated || istype(A, /mob/dead))
|
||||||
|
continue
|
||||||
|
if(istype(A, /mob/living))
|
||||||
|
var/mob/living/M = A
|
||||||
|
M.gib()
|
||||||
|
else
|
||||||
|
qdel(A)
|
||||||
|
|
||||||
|
// 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))
|
||||||
|
if(drop.buckled)
|
||||||
|
drop.buckled = null
|
||||||
|
drop.loc = T
|
||||||
|
drop.forceMove(T)
|
||||||
|
else if(ispath(drop_type))
|
||||||
|
drop = new drop_type(T)
|
||||||
|
if(istype(drop))
|
||||||
|
if(drop.buckled)
|
||||||
|
drop.buckled = null
|
||||||
|
drop.loc = T
|
||||||
|
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/turf/holder_turf = locate(157,254,2) // This is in the admin jails, will need adjusting for other mobs.
|
||||||
|
if(!istype(holder_turf))
|
||||||
|
usr << "Nowhere to put the mobs, aborting."
|
||||||
|
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++)
|
||||||
|
spawned_mobs |= new spawn_path(holder_turf)
|
||||||
|
else
|
||||||
|
var/list/candidates = list()
|
||||||
|
for(var/client/player in clients)
|
||||||
|
if(player.mob && istype(player.mob, /mob/dead/observer))
|
||||||
|
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(holder_turf)
|
||||||
|
|
||||||
|
// 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
|
||||||
|
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-2, usr.y-2, usr.z, supplied_drops = spawned_mobs, automated = automatic_pod)
|
||||||
80
code/modules/random_map/drop/droppod_doors.dm
Normal file
80
code/modules/random_map/drop/droppod_doors.dm
Normal file
@@ -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 range(5,src))
|
||||||
|
if(D.deployed)
|
||||||
|
continue
|
||||||
|
D.deploy()
|
||||||
|
|
||||||
|
// Overwrite turfs.
|
||||||
|
var/turf/origin = get_turf(src)
|
||||||
|
origin.ChangeTurf(/turf/simulated/floor/engine)
|
||||||
|
origin.set_light(0) // Forcing updates
|
||||||
|
var/turf/T = get_step(origin, src.dir)
|
||||||
|
T.ChangeTurf(/turf/simulated/floor/engine)
|
||||||
|
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
|
||||||
|
opacity = 0
|
||||||
|
icon_state = "ramptop"
|
||||||
|
var/obj/structure/droppod_door/door_bottom = new(T)
|
||||||
|
door_bottom.deployed = 1
|
||||||
|
door_bottom.density = 0
|
||||||
|
door_bottom.opacity = 0
|
||||||
|
door_bottom.dir = src.dir
|
||||||
|
door_bottom.icon_state = "rampbottom"
|
||||||
@@ -1,134 +1,33 @@
|
|||||||
#define SD_FLOOR_TILE 0
|
/datum/random_map/droppod/supply
|
||||||
#define SD_WALL_TILE 1
|
descriptor = "supply drop"
|
||||||
#define SD_DOOR_TILE 2
|
|
||||||
#define SD_EMPTY_TILE 3
|
|
||||||
#define SD_SUPPLY_TILE 7
|
|
||||||
var/global/list/supply_drop_random_loot_types = list(
|
|
||||||
"guns",
|
|
||||||
"seeds",
|
|
||||||
"materials",
|
|
||||||
"food",
|
|
||||||
"armour",
|
|
||||||
"medical",
|
|
||||||
"power",
|
|
||||||
"hydroponics",
|
|
||||||
"lasers",
|
|
||||||
"ballistics"
|
|
||||||
)
|
|
||||||
|
|
||||||
/datum/random_map/supplydrop
|
|
||||||
descriptor = "small supply drop"
|
|
||||||
initial_wall_cell = 0
|
|
||||||
limit_x = 5
|
limit_x = 5
|
||||||
limit_y = 5
|
limit_y = 5
|
||||||
|
|
||||||
var/list/custom_loot_types = list()
|
placement_explosion_dev = 3
|
||||||
var/loot_type
|
placement_explosion_heavy = 5
|
||||||
var/placement_explosion_dev = 3
|
placement_explosion_light = 7
|
||||||
var/placement_explosion_heavy = 5
|
placement_explosion_flash = 5
|
||||||
var/placement_explosion_light = 7
|
|
||||||
var/placement_explosion_flash = 5
|
|
||||||
|
|
||||||
/datum/random_map/supplydrop/New(var/seed, var/tx, var/ty, var/tz, var/tlx, var/tly, var/do_not_apply, var/do_not_announce, var/list/supplied_drops, var/supplied_loot_type)
|
// UNLIKE THE DROP POD, this map deals ENTIRELY with strings and types.
|
||||||
if(islist(supplied_drops) && supplied_drops.len)
|
// Drop type is a string representing a mode rather than an atom or path.
|
||||||
custom_loot_types = supplied_drops
|
// supplied_drop_types is a list of types to spawn in the pod.
|
||||||
loot_type = "custom"
|
/datum/random_map/droppod/supply/get_spawned_drop(var/turf/T)
|
||||||
else if(supplied_loot_type)
|
|
||||||
loot_type = supplied_loot_type
|
|
||||||
..(seed, tx, ty, tz, tlx, tly, do_not_apply, do_not_announce)
|
|
||||||
|
|
||||||
/datum/random_map/supplydrop/generate_map()
|
if(!drop_type) drop_type = pick(supply_drop_random_loot_types)
|
||||||
|
|
||||||
// No point calculating these 200 times.
|
if(drop_type == "custom")
|
||||||
var/x_midpoint = n_ceil(limit_x / 2)
|
if(supplied_drop_types.len)
|
||||||
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)
|
|
||||||
|
|
||||||
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(!on_x_bound || !on_y_bound)
|
|
||||||
map[current_cell] = SD_WALL_TILE
|
|
||||||
//Don't draw the far corners.
|
|
||||||
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/supplydrop/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/supplydrop/get_appropriate_path(var/value)
|
|
||||||
if(value == SD_FLOOR_TILE || value == SD_SUPPLY_TILE|| value == SD_DOOR_TILE)
|
|
||||||
return floor_type
|
|
||||||
else if(value == SD_WALL_TILE)
|
|
||||||
return wall_type
|
|
||||||
return null
|
|
||||||
|
|
||||||
/datum/random_map/supplydrop/get_additional_spawns(var/value, var/turf/T)
|
|
||||||
|
|
||||||
// Splatter anything under us that survived the explosion.
|
|
||||||
if(value != SD_EMPTY_TILE && T.contents.len)
|
|
||||||
for(var/atom/A in T)
|
|
||||||
if(!A.simulated || istype(A, /mob/dead))
|
|
||||||
continue
|
|
||||||
if(istype(A, /mob/living))
|
|
||||||
var/mob/living/M = A
|
|
||||||
M.gib()
|
|
||||||
else
|
|
||||||
qdel(A)
|
|
||||||
|
|
||||||
// Also spawn doors and loot.
|
|
||||||
if(value == SD_DOOR_TILE)
|
|
||||||
var/obj/machinery/door/airlock/A = new(T)
|
|
||||||
A.id_tag = name
|
|
||||||
else if(value == SD_SUPPLY_TILE)
|
|
||||||
get_spawned_loot(T)
|
|
||||||
|
|
||||||
/datum/random_map/supplydrop/proc/get_spawned_loot(var/turf/T)
|
|
||||||
|
|
||||||
if(!loot_type) loot_type = pick(supply_drop_random_loot_types)
|
|
||||||
|
|
||||||
if(loot_type == "custom")
|
|
||||||
if(custom_loot_types.len)
|
|
||||||
var/obj/structure/largecrate/C = locate() in T
|
var/obj/structure/largecrate/C = locate() in T
|
||||||
for(var/drop_type in custom_loot_types)
|
for(var/drop_type in supplied_drop_types)
|
||||||
var/atom/movable/A = new drop_type(T)
|
var/atom/movable/A = new drop_type(T)
|
||||||
if(!istype(A, /mob))
|
if(!istype(A, /mob))
|
||||||
if(!C) C = new(T)
|
if(!C) C = new(T)
|
||||||
C.contents |= A
|
C.contents |= A
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
loot_type = pick(supply_drop_random_loot_types)
|
drop_type = pick(supply_drop_random_loot_types)
|
||||||
|
|
||||||
switch(loot_type)
|
switch(drop_type)
|
||||||
if("lasers")
|
if("lasers")
|
||||||
var/obj/structure/largecrate/C = new(T)
|
var/obj/structure/largecrate/C = new(T)
|
||||||
new /obj/item/weapon/gun/energy/laser(C)
|
new /obj/item/weapon/gun/energy/laser(C)
|
||||||
@@ -285,4 +184,4 @@ var/global/list/supply_drop_random_loot_types = list(
|
|||||||
if(choice == "No")
|
if(choice == "No")
|
||||||
return
|
return
|
||||||
log_admin("[key_name(usr)] dropped supplies at ([usr.x],[usr.y],[usr.z])")
|
log_admin("[key_name(usr)] dropped supplies at ([usr.x],[usr.y],[usr.z])")
|
||||||
new /datum/random_map/supplydrop(null, usr.x-2, usr.y-2, usr.z, supplied_drops = chosen_loot_types, supplied_loot_type = chosen_loot_type)
|
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)
|
||||||
@@ -17,6 +17,7 @@ var/global/list/map_count = list()
|
|||||||
var/limit_x = 128 // Default x size.
|
var/limit_x = 128 // Default x size.
|
||||||
var/limit_y = 128 // Default y size.
|
var/limit_y = 128 // Default y size.
|
||||||
var/auto_apply = 1
|
var/auto_apply = 1
|
||||||
|
var/preserve_map = 1
|
||||||
|
|
||||||
// Turf paths.
|
// Turf paths.
|
||||||
var/wall_type = /turf/simulated/wall
|
var/wall_type = /turf/simulated/wall
|
||||||
@@ -38,7 +39,7 @@ var/global/list/map_count = list()
|
|||||||
else
|
else
|
||||||
map_count[descriptor]++
|
map_count[descriptor]++
|
||||||
name = "[descriptor] #[map_count[descriptor]]"
|
name = "[descriptor] #[map_count[descriptor]]"
|
||||||
random_maps[name] = src
|
if(preserve_map) random_maps[name] = src
|
||||||
|
|
||||||
// Get origins for applying the map later.
|
// Get origins for applying the map later.
|
||||||
set_origins(tx, ty, tz)
|
set_origins(tx, ty, tz)
|
||||||
@@ -168,9 +169,12 @@ var/global/list/map_count = list()
|
|||||||
var/newpath = get_appropriate_path(map[current_cell])
|
var/newpath = get_appropriate_path(map[current_cell])
|
||||||
if(newpath)
|
if(newpath)
|
||||||
T.ChangeTurf(newpath)
|
T.ChangeTurf(newpath)
|
||||||
get_additional_spawns(map[current_cell],T)
|
get_additional_spawns(map[current_cell],T,get_spawn_dir(x, y))
|
||||||
return T
|
return T
|
||||||
|
|
||||||
|
/datum/random_map/proc/get_spawn_dir()
|
||||||
|
return 0
|
||||||
|
|
||||||
/datum/random_map/proc/get_appropriate_path(var/value)
|
/datum/random_map/proc/get_appropriate_path(var/value)
|
||||||
switch(value)
|
switch(value)
|
||||||
if(FLOOR_CHAR)
|
if(FLOOR_CHAR)
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 93 KiB After Width: | Height: | Size: 96 KiB |
Reference in New Issue
Block a user