diff --git a/code/defines/area/Space Station 13 areas.dm b/code/defines/area/Space Station 13 areas.dm
index 676e826832..98ab8f41f3 100644
--- a/code/defines/area/Space Station 13 areas.dm
+++ b/code/defines/area/Space Station 13 areas.dm
@@ -1423,20 +1423,21 @@ proc/process_ghost_teleport_locs()
+// Away Missions
+/area/awaymission
+ name = "\improper Strange Location"
+ icon_state = "away"
+
+/area/awaymission/example
+ name = "\improper Strange Station"
+ icon_state = "away"
+
+/area/awaymission/desert
+ name = "Mars"
+ icon_state = "away"
-
-
-
-
-
-
-/area/turret_protected/AssistantRoom
- name = "\improper Assistant Room"
- icon_state = "storage"
- lighting_use_dynamic = 0
-
/////////////////////////////////////////////////////////////////////
/*
Lists of areas to be used with is_type_in_list.
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index b144f57286..f00137d264 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -76,18 +76,6 @@
throwforce = 10
w_class = 1
-/obj/item/weapon/sord
- name = "\improper SORD"
- desc = "This thing is so unspeakably shitty you are having a hard time even holding it."
- icon_state = "sord"
- item_state = "sord"
- flags = FPRINT | TABLEPASS
- slot_flags = SLOT_BELT
- force = 2
- throwforce = 1
- w_class = 3
- attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
-
/obj/item/weapon/sord/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob)
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
return ..()
@@ -721,28 +709,6 @@
icon_state = "fcardholder0"
item_state = "clipboard"
-/obj/item/weapon/flasks
- name = "flask"
- icon = 'icons/obj/Cryogenic2.dmi'
- var/oxygen = 0.0
- var/plasma = 0.0
- var/coolant = 0.0
-
-/obj/item/weapon/flasks/coolant
- name = "light blue flask"
- icon_state = "coolant-c"
- coolant = 1000.0
-
-/obj/item/weapon/flasks/oxygen
- name = "blue flask"
- icon_state = "oxygen-c"
- oxygen = 500.0
-
-/obj/item/weapon/flasks/plasma
- name = "orange flask"
- icon_state = "plasma-c"
- plasma = 500.0
-
/*
/obj/item/weapon/game_kit
name = "Gaming Kit"
diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm
index 15819021ec..b23aa77cc8 100644
--- a/code/game/objects/items/weapons/cigs_lighters.dm
+++ b/code/game/objects/items/weapons/cigs_lighters.dm
@@ -1,5 +1,3 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
-
/*
CONTAINS:
MATCHES
@@ -7,6 +5,7 @@ CIGARETTES
CIGARS
SMOKING PIPES
CIG PACKET
+CHEAP LIGHTERS
ZIPPO
*/
@@ -14,8 +13,8 @@ ZIPPO
//MATCHES//
///////////
/obj/item/weapon/match
- name = "Match"
- desc = "A simple match stick, used for lighting tobacco"
+ name = "match"
+ desc = "A simple match stick, used for lighting fine smokables."
icon = 'icons/obj/cigarettes.dmi'
icon_state = "match_unlit"
var/lit = 0
@@ -27,10 +26,10 @@ ZIPPO
process()
var/turf/location = get_turf(src)
- src.smoketime--
- if(src.smoketime < 1)
- src.icon_state = "match_burnt"
- src.lit = -1
+ smoketime--
+ if(smoketime < 1)
+ icon_state = "match_burnt"
+ lit = -1
processing_objects.Remove(src)
return
if(location)
@@ -39,20 +38,18 @@ ZIPPO
dropped(mob/user as mob)
- if(src.lit == 1)
- src.lit = -1
- src.damtype = "brute"
- src.icon_state = "match_burnt"
- src.item_state = "cigoff"
- src.name = "Burnt match"
- src.desc = "A match that has been burnt"
+ if(lit == 1)
+ lit = -1
+ damtype = "brute"
+ icon_state = "match_burnt"
+ item_state = "cigoff"
+ name = "burnt match"
+ desc = "A match. This one has seen better days."
return ..()
-
-///////////////////////
-//CIGARETTES + CIGARS//
-///////////////////////
-
+//////////////////
+//FINE SMOKABLES//
+//////////////////
/obj/item/clothing/mask/cigarette
name = "cigarette"
desc = "A roll of tobacco and nicotine."
@@ -115,37 +112,37 @@ ZIPPO
/obj/item/clothing/mask/cigarette/afterattack(obj/item/weapon/reagent_containers/glass/glass, mob/user as mob)
..()
- if(istype(glass)) // you can dip cigarettes into beakers
+ if(istype(glass)) //you can dip cigarettes into beakers
var/transfered = glass.reagents.trans_to(src, chem_volume)
- if(transfered) // if reagents were transfered, show the message
- user << "\blue You dip \the [src] into \the [glass]."
- else // if not, either the beaker was empty, or the cigarette was full
+ if(transfered) //if reagents were transfered, show the message
+ user << "You dip \the [src] into \the [glass]."
+ else //if not, either the beaker was empty, or the cigarette was full
if(!glass.reagents.total_volume)
- user << "\red [glass] is empty."
+ user << "[glass] is empty."
else
- user << "\red [src] is full."
+ user << "[src] is full."
/obj/item/clothing/mask/cigarette/proc/light(var/flavor_text = "[usr] lights the [name].")
- if(!src.lit)
- src.lit = 1
- src.damtype = "fire"
+ if(!lit)
+ lit = 1
+ damtype = "fire"
if(reagents.get_reagent_amount("plasma")) // the plasma explodes when exposed to fire
var/datum/effect/effect/system/reagents_explosion/e = new()
- e.set_up(round (src.reagents.get_reagent_amount("plasma")/2.5, 1), get_turf(src), 0, 0)
+ e.set_up(round (reagents.get_reagent_amount("plasma")/2.5, 1), get_turf(src), 0, 0)
e.start()
del(src)
return
if(reagents.get_reagent_amount("fuel")) // the fuel explodes, too, but much less violently
var/datum/effect/effect/system/reagents_explosion/e = new()
- e.set_up(round (src.reagents.get_reagent_amount("fuel")/5, 1), get_turf(src), 0, 0)
+ e.set_up(round (reagents.get_reagent_amount("fuel")/5, 1), get_turf(src), 0, 0)
e.start()
del(src)
return
- src.flags &= ~NOREACT // allowing reagents to react after being lit
- src.reagents.handle_reactions()
- src.icon_state = icon_on
- src.item_state = icon_on
+ flags &= ~NOREACT // allowing reagents to react after being lit
+ reagents.handle_reactions()
+ icon_state = icon_on
+ item_state = icon_on
for(var/mob/O in viewers(usr, null))
O.show_message(flavor_text, 1)
processing_objects.Add(src)
@@ -153,13 +150,13 @@ ZIPPO
/obj/item/clothing/mask/cigarette/process()
var/turf/location = get_turf(src)
- src.smoketime--
- if(src.smoketime < 1)
+ smoketime--
+ if(smoketime < 1)
new type_butt(location)
processing_objects.Remove(src)
- if(ismob(src.loc))
- var/mob/living/M = src.loc
- M << "\red Your [src.name] goes out."
+ if(ismob(loc))
+ var/mob/living/M = loc
+ M << "\red Your [name] goes out."
M.u_equip(src) //un-equip it so the overlays can update
M.update_icons()
del(src)
@@ -167,7 +164,7 @@ ZIPPO
if(location)
location.hotspot_expose(700, 5)
if(reagents && reagents.total_volume) // check if it has any reagents at all
- if( iscarbon(src.loc) && (src == loc:wear_mask) ) // if it's in the human/monkey mouth, transfer reagents to the mob
+ if( iscarbon(loc) && (src == loc:wear_mask) ) // if it's in the human/monkey mouth, transfer reagents to the mob
var/mob/living/carbon/C = loc
if(prob(15)) // so it's not an instarape in case of acid
reagents.reaction(C, INGEST)
@@ -178,9 +175,9 @@ ZIPPO
/obj/item/clothing/mask/cigarette/dropped(mob/user as mob)
- if(src.lit == 1)
+ if(lit == 1)
for(var/mob/O in viewers(user, null))
- O.show_message(text("\red [] calmly drops and treads on the lit [], putting it out instantly.", user,src.name), 1)
+ O.show_message(text("\red [] calmly drops and treads on the lit [], putting it out instantly.", user,name), 1)
new type_butt(loc)
processing_objects.Remove(src)
del(src)
@@ -283,26 +280,26 @@ ZIPPO
light("\red [user] lights their [name] with their [W].")
light(var/flavor_text = "[usr] lights the [name].")
- if(!src.lit)
- src.lit = 1
- src.damtype = "fire"
- src.icon_state = icon_on
- src.item_state = icon_on
+ if(!lit)
+ lit = 1
+ damtype = "fire"
+ icon_state = icon_on
+ item_state = icon_on
for(var/mob/O in viewers(usr, null))
O.show_message(flavor_text, 1)
processing_objects.Add(src)
process()
var/turf/location = get_turf(src)
- src.smoketime--
- if(src.smoketime < 1)
+ smoketime--
+ if(smoketime < 1)
new /obj/effect/decal/cleanable/ash(location)
- if(ismob(src.loc))
- var/mob/living/M = src.loc
- M << "\red Your [src.name] goes out, and you empty the ash."
- src.lit = 0
- src.icon_state = icon_off
- src.item_state = icon_off
+ if(ismob(loc))
+ var/mob/living/M = loc
+ M << "\red Your [name] goes out, and you empty the ash."
+ lit = 0
+ icon_state = icon_off
+ item_state = icon_off
processing_objects.Remove(src)
return
if(location)
@@ -310,17 +307,16 @@ ZIPPO
return
dropped(mob/user as mob)
- if(src.lit == 1)
- for(var/mob/O in viewers(user, null))
- O.show_message(text("\red [] puts out the [].", user,src.name), 1)
- src.lit = 0
- src.icon_state = icon_off
- src.item_state = icon_off
+ if(lit == 1)
+ user.visible_message("[user] puts out [src].")
+ lit = 0
+ icon_state = icon_off
+ item_state = icon_off
processing_objects.Remove(src)
return ..()
/obj/item/clothing/mask/pipe/attack_self(mob/user as mob) //Refills the pipe. Can be changed to an attackby later, if loose tobacco is added to vendors or something.
- if(src.smoketime <= 0)
+ if(smoketime <= 0)
user << "\blue You refill the pipe with tobacco."
smoketime = maxsmoketime
return
@@ -371,13 +367,13 @@ ZIPPO
attack_hand(mob/user as mob)
if(user.r_hand == src || user.l_hand == src)
if(cigcount == 0)
- user << "\red You're out of cigs, shit! How you gonna get through the rest of the day..."
+ user << "You're out of cigs, shit! How you gonna get through the rest of the day..."
return
else
var/obj/item/clothing/mask/cigarette/W = new /obj/item/clothing/mask/cigarette(user)
reagents.trans_to(W, (reagents.total_volume/cigcount))
user.put_in_active_hand(W)
- src.reagents.maximum_volume = 15*cigcount
+ reagents.maximum_volume = 15*cigcount
cigcount--
else
return ..()
@@ -428,10 +424,10 @@ ZIPPO
attack_self(mob/living/user)
if(user.r_hand == src || user.l_hand == src)
- if(!src.lit)
- src.lit = 1
- src.icon_state = icon_on
- src.item_state = icon_on
+ if(!lit)
+ lit = 1
+ icon_state = icon_on
+ item_state = icon_on
if( istype(src,/obj/item/weapon/lighter/zippo) )
for(var/mob/O in viewers(user, null))
O.show_message(text("\red Without even breaking stride, [] flips open and lights the [] in one smooth movement.", user, src), 1)
@@ -448,9 +444,9 @@ ZIPPO
user.SetLuminosity(user.luminosity + 2)
processing_objects.Add(src)
else
- src.lit = 0
- src.icon_state = icon_off
- src.item_state = icon_off
+ lit = 0
+ icon_state = icon_off
+ item_state = icon_off
if( istype(src,/obj/item/weapon/lighter/zippo) )
for(var/mob/O in viewers(user, null))
O.show_message(text("\red You hear a quiet click, as [] shuts off the [] without even looking at what they're doing. Wow.", user, src), 1)
@@ -469,11 +465,11 @@ ZIPPO
if(!istype(M, /mob))
return
- if(istype(M.wear_mask,/obj/item/clothing/mask/cigarette) && user.zone_sel.selecting == "mouth" && src.lit)
+ if(istype(M.wear_mask,/obj/item/clothing/mask/cigarette) && user.zone_sel.selecting == "mouth" && lit)
if(M == user)
- M.wear_mask:light("\red With a single flick of their wrist, [user] smoothly lights their [M.wear_mask.name] with their [src.name]. Damn they're cool.")
+ M.wear_mask:light("\red With a single flick of their wrist, [user] smoothly lights their [M.wear_mask.name] with their [name]. Damn they're cool.")
else
- M.wear_mask:light("\red [user] whips the [src.name] out and holds it for [M]. Their arm is as steady as the unflickering flame they light the [M.wear_mask.name] with.")
+ M.wear_mask:light("\red [user] whips the [name] out and holds it for [M]. Their arm is as steady as the unflickering flame they light the [M.wear_mask.name] with.")
else
..()
@@ -487,7 +483,7 @@ ZIPPO
pickup(mob/user)
if(lit)
- src.SetLuminosity(0)
+ SetLuminosity(0)
user.SetLuminosity(user.luminosity+2)
return
@@ -495,5 +491,5 @@ ZIPPO
dropped(mob/user)
if(lit)
user.SetLuminosity(user.luminosity-2)
- src.SetLuminosity(2)
+ SetLuminosity(2)
return
diff --git a/code/global.dm b/code/global.dm
index 60d4028847..3ea951884f 100644
--- a/code/global.dm
+++ b/code/global.dm
@@ -169,6 +169,9 @@ var/list/AAlarmWireColorToIndex
#define shuttle_time_in_station 1800 // 3 minutes in the station
#define shuttle_time_to_arrive 6000 // 10 minutes to arrive
+ //away missions
+var/list/awaydestinations = list()
+
// MySQL configuration
diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm
new file mode 100644
index 0000000000..53c17d54a7
--- /dev/null
+++ b/code/modules/awaymissions/gateway.dm
@@ -0,0 +1,91 @@
+/obj/machinery/gateway
+ name = "gateway"
+ desc = "It's a Nanotrasen approved one-way experimental teleporter that will take you places. Still has the pricetag on it."
+ icon = 'icons/obj/machines/gateway.dmi'
+ density = 1
+ anchored = 1
+ var/active = 0
+
+/obj/machinery/gateway/initialize()
+ update_icon()
+ if(dir == 2)
+ density = 0
+
+/obj/machinery/gateway/update_icon()
+ if(active)
+ icon_state = "on[dir]"
+ return
+ icon_state = "off[dir]"
+
+/obj/machinery/gateway/attack_hand(mob/user as mob)
+ update_icon()
+
+
+
+//this is da important part wot makes things go
+/obj/machinery/gateway/center
+ density = 1
+ dir = 3 //this doesn't work for some reason? see below
+ var/list/linked = list() //a list of the connected gateway chunks
+ var/ready = 0
+
+/obj/machinery/gateway/center/initialize()
+ dir = 3 //see above
+ update_icon()
+
+/obj/machinery/gateway/center/proc/detect()
+ linked = list() //clear the list
+ var/turf/T = loc
+
+ for(var/i in alldirs)
+ T = get_step(loc, i)
+ var/obj/machinery/gateway/G = locate(/obj/machinery/gateway) in T
+ if(G)
+ linked.Add(G)
+ continue
+
+ //this is only done if we fail to find a part
+ ready = 0
+ toggleoff()
+ break
+
+ if(linked.len == 8)
+ ready = 1
+
+/obj/machinery/gateway/center/proc/toggleon()
+ if(!ready) return
+ if(linked.len != 8) return
+
+ for(var/obj/machinery/gateway/G in linked)
+ G.active = 1
+ G.update_icon()
+ active = 1
+ update_icon()
+ density = 0
+
+/obj/machinery/gateway/center/proc/toggleoff()
+ for(var/obj/machinery/gateway/G in linked)
+ G.active = 0
+ G.update_icon()
+ active = 0
+ update_icon()
+ density = 1
+
+/obj/machinery/gateway/center/attack_hand(mob/user as mob)
+ if(!ready)
+ detect()
+ return
+ if(!active)
+ toggleon()
+ return
+ toggleoff()
+
+//okay, here's the good teleporting stuff
+/obj/machinery/gateway/center/HasEntered(mob/user as mob)
+ if(!ready) return
+ if(!active) return
+
+ var/obj/effect/landmark/dest = pick(awaydestinations)
+ if(dest)
+ user.loc = dest.loc
+ return
\ No newline at end of file
diff --git a/code/modules/awaymissions/loot.dm b/code/modules/awaymissions/loot.dm
new file mode 100644
index 0000000000..0f67d37522
--- /dev/null
+++ b/code/modules/awaymissions/loot.dm
@@ -0,0 +1,17 @@
+/obj/effect/spawner/lootdrop
+ icon = 'icons/mob/screen1.dmi'
+ icon_state = "x2"
+ var/lootcount = 1 //how many items will be spawned
+ var/lootdoubles = 0 //if the same item can be spawned twice
+ var/loot = "" //a list of possible items to spawn- a string of paths
+
+/obj/effect/spawner/lootdrop/initialize()
+ var/list/things = params2list(loot)
+ if(things && things.len)
+ for(var/i = lootcount, i > 0, i--)
+ var/lootspawn = text2path(pick(things))
+ if(!lootdoubles)
+ things.Remove(lootspawn)
+
+ new lootspawn(get_turf(src))
+ del(src)
\ No newline at end of file
diff --git a/code/modules/maps/dmm_suite.dm b/code/modules/awaymissions/maploader/dmm_suite.dm
similarity index 100%
rename from code/modules/maps/dmm_suite.dm
rename to code/modules/awaymissions/maploader/dmm_suite.dm
diff --git a/code/modules/maps/reader.dm b/code/modules/awaymissions/maploader/reader.dm
similarity index 100%
rename from code/modules/maps/reader.dm
rename to code/modules/awaymissions/maploader/reader.dm
diff --git a/code/modules/maps/SwapMaps.dm b/code/modules/awaymissions/maploader/swapmaps.dm
similarity index 100%
rename from code/modules/maps/SwapMaps.dm
rename to code/modules/awaymissions/maploader/swapmaps.dm
diff --git a/code/modules/maps/writer.dm b/code/modules/awaymissions/maploader/writer.dm
similarity index 100%
rename from code/modules/maps/writer.dm
rename to code/modules/awaymissions/maploader/writer.dm
diff --git a/code/modules/awaymissions/trigger.dm b/code/modules/awaymissions/trigger.dm
new file mode 100644
index 0000000000..ff1279d3c9
--- /dev/null
+++ b/code/modules/awaymissions/trigger.dm
@@ -0,0 +1,7 @@
+/obj/effect/step_trigger/message
+ var/message //the message to give to the mob
+
+/obj/effect/step_trigger/message/Trigger(mob/M as mob)
+ if(M.client)
+ M << "[message]"
+ del(src)
\ No newline at end of file
diff --git a/code/modules/maps/randomZlevel.dm b/code/modules/awaymissions/zlevel.dm
similarity index 67%
rename from code/modules/maps/randomZlevel.dm
rename to code/modules/awaymissions/zlevel.dm
index fcc724d3f0..6aee839105 100644
--- a/code/modules/maps/randomZlevel.dm
+++ b/code/modules/awaymissions/zlevel.dm
@@ -7,7 +7,7 @@ proc/createRandomZlevel()
if (!text) // No random Z-levels for you.
return
- world << "\red \b Reticulating Splines"
+ world << "\red \b Searching for away missions..."
var/list/CL = dd_text2list(text, "\n")
@@ -38,10 +38,20 @@ proc/createRandomZlevel()
if(potentialRandomZlevels.len)
+ world << "\red \b Loading away mission..."
+
var/map = pick(potentialRandomZlevels)
var/file = file(map)
if(isfile(file))
maploader.load_map(file)
+ for(var/obj/effect/landmark/L in world)
+ if (L.name != "awaystart")
+ continue
+ awaydestinations.Add(L)
+
+ world << "\red \b Away mission loaded."
+
else
+ world << "\red \b No away missions found."
return
\ No newline at end of file
diff --git a/code/modules/maps/fromdmp.dm b/code/modules/maps/fromdmp.dm
deleted file mode 100644
index c9074f0417..0000000000
--- a/code/modules/maps/fromdmp.dm
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- DMP to swapmap converter
- version 1.0
-
- by Lummox JR
- */
-
-mob/verb/Convert(filename as file)
- dmp2swapmap(filename)
-
-proc/d2sm_prepmap(filename)
- var/txt = file2text(filename)
- if(!txt) return
- var/i,j
- i=findText(txt,ascii2text(13)) // eliminate carriage returns
- while(i)
- txt=copytext(txt,1,i)+copytext(txt,i+1)
- i=findText(txt,ascii2text(13),i)
- i=findText(txt,"\\\n")
- while(i)
- for(j=i+2,j<=length(txt),++j) if(text2ascii(txt,j)>32) break
- txt=copytext(txt,1,i)+copytext(txt,j)
- i=findText(txt,"\\\n",i)
- return txt
-
-proc/dmp2swapmap(filename)
- //var/txt = file2text(filename)
- //if(!txt) return
- var/txt = d2sm_prepmap(filename)
- var/mapname="[filename]"
- var/i,j,k
- i=findtext(mapname,".dmp")
- while(i && i+432) break
- txt=copytext(txt,1,i)+copytext(txt,j)
- i=findText(txt,"\\\n",i) */
- var/list/codes=new
- var/codelen=1
- var/list/areas
- var/mode=34
- var/z=0
- var/X=0,Y=0,Z=0
- while(txt)
- if(text2ascii(txt)==34)
- if(mode!=34)
- world << "Corrupt map file [filename]: Unexpected code found after z-level [z]"
- return
- // standard line:
- // "a" = (/obj, /obj, /turf, /area)
- i=findtext(txt,"\"",2)
- var/code=copytext(txt,2,i)
- codelen=length(code)
- i=findtext(txt,"(",i)
- if(!i)
- world << "Corrupt map file [filename]: No type list follows \"[code]\""
- return
- k=findtext(txt,"\n",++i)
- j=(k || length(txt+1))
- while(--j>=i && text2ascii(txt,j)!=41)
- if(j2) codetrans+=d2sm_Contents(L,L.len-2,"\t\t\t\t")
- codes[code]=copytext(codetrans,1,length(codetrans))
- else if(text2ascii(txt)==40)
- mode=40
- // standard line (top-down, left-right symbol order):
- // (1,1,1) = {"
- // abcde
- // bcdef
- // "}
- i=d2sm_MatchBrace(txt,1,40)
- if(!i)
- world << "Corrupt map file [filename]: No matching ) for coordinates: [copytext(txt,1,findtext(txt,"\n"))]"
- return
- var/list/coords=d2sm_ParseCommaList(copytext(txt,2,i))
- if(istext(coords) || coords.len!=3)
- world << "Corrupt map file [filename]: [istext(coords)?(coords):"[copytext(txt,1,i+1)] is not a valid (x,y,z) coordinate"]"
- return
- j=findtext(txt,"{",i+1)
- if(!j)
- world << "Corrupt map file [filename]: No braces {} following [copytext(txt,1,i+1)]"
- return
- k=d2sm_MatchBrace(txt,j,123)
- if(!k)
- world << "Corrupt map file [filename]: No closing brace } following [copytext(txt,1,i+1)]"
- return
- var/mtxt=copytext(txt,j+1,k)
- if(findText(mtxt,"\"\n")!=1 || !findText(mtxt,"\n\"",length(mtxt)-1))
- world << findText(mtxt,"\"\n")
- world << findText(mtxt,"\n\"",length(mtxt)-1)
- world << "Corrupt map file [filename]: No quotes in braces following [copytext(txt,1,i+1)]"
- return
- mtxt=copytext(mtxt,2,length(mtxt))
- var/_x=0,_y=0
- for(i=1,,++_y)
- j=findText(mtxt,"\n",i+1)
- if(!j) break
- _x=max(_x,(j-i-1)/codelen)
- i=j
- X=max(X,_x)
- Y=max(Y,_y)
- z=text2num(coords[3])
- Z=max(Z,z)
- txt=copytext(txt,k+1)
- else
- i=findtext(txt,"\n")
- txt=i?copytext(txt,i+1):null
- world << "Map size: [X],[Y],[Z]"
- //for(var/code in codes)
- // world << "Code \"[code]\":\n[codes[code]]"
- fdel("map_[mapname].txt")
- var/F = file("map_[mapname].txt")
- F << ". = object(\".0\")\n.0\n\ttype = /swapmap\n\tid = \"[mapname]\"\n\tz = [Z]\n\ty = [Y]\n\tx = [X]"
- if(areas)
- txt=""
- for(i=0,i0,--y) // map is top-down
- ++i
- F << "\t\t[y]"
- for(var/x in 1 to _x)
- F << "\t\t\t[x]"
- j=i+codelen
- F << codes[copytext(mtxt,i,j)]
- i=j
- txt=copytext(txt,k+1)
- /* for(z in 1 to Z)
- F << "\t[z]"
- for(var/y in 1 to Y)
- F << "\t\t[y]"
- for(var/x in 1 to X)
- F << "\t\t\t[x]"
- F << codes[pick(codes)] */
-
-proc/d2sm_ParseCommaList(txt)
- var/list/L=new
- var/i,ch
- for(i=1,i<=length(txt),++i)
- if(text2ascii(txt,i)>32) break
- for(,i<=length(txt),++i)
- ch=text2ascii(txt,i)
- if(ch==44)
- L+=copytext(txt,1,i)
- for(++i,i<=length(txt),++i) if(text2ascii(txt,i)>32) break
- txt=copytext(txt,i)
- i=0;continue
- if(ch==40 || ch==91 || ch==123)
- i=d2sm_MatchBrace(txt,i,ch)
- if(!i) return "No matching brace found for [ascii2text(ch)]"
- if(i>1) L+=copytext(txt,1,i)
- return L
-
-proc/d2sm_MatchBrace(txt, i, which)
- if(which==40) ++which
- else which+=2
- var/j,ch
- for(j=i+1,j<=length(txt),++j)
- ch=text2ascii(txt,j)
- if(ch==which) return j
- if(ch==40 || ch==91 || ch==123)
- j=d2sm_MatchBrace(txt,j,ch)
- if(!j) return 0
-
-proc/d2sm_ConvertType(tt,tabs="")
- var/i=findText(tt,"{")
- if(!i) return "[tabs]type = [tt]\n"
- .="[tabs]type = [copytext(tt,1,i)]\n"
- var/list/L=d2sm_ParseCommaList(copytext(tt,i+1,d2sm_MatchBrace(tt,i,123)))
- if(istext(L)) return
- for(var/pair in L)
- .="[.][tabs][pair]\n"
-
-proc/d2sm_Contents(list/conts,n,tabs="")
- .="[tabs]contents = list("
- var/i
- for(i=0,i