dmm_suite{ load_map(var/dmm_file as file, var/z_offset as num){ if(!z_offset){ z_offset = world.maxz+1 } var/quote = ascii2text(34) var/tfile = file2text(dmm_file) var/tfile_len = length(tfile) var/list/grid_models[0] var/key_len = length(copytext(tfile,2,findtext(tfile,quote,2,0))) for(var/lpos=1;lposlength(zgrid)){break} sleep(-1) } if(findtext(tfile,quote+"}",zpos,0)+2==tfile_len){break} sleep(-1) } } proc{ parse_grid(var/model as text,var/xcrd as num,var/ycrd as num,var/zcrd as num){ /*Method parse_grid() - Accepts a text string containing a comma separated list of type paths of the same construction as those contained in a .dmm file, and instantiates them. */ var/list/text_strings[0] for(var/index=1;findtext(model,quote);index++){ /*Loop: Stores quoted portions of text in text_strings, and replaces them with an index to that list. - Each iteration represents one quoted section of text. */ text_strings.len=index text_strings[index] = copytext(model,findtext(model,quote)+1,findtext(model,quote,findtext(model,quote)+1,0)) model = copytext(model,1,findtext(model,quote))+"~[index]"+copytext(model,findtext(model,quote,findtext(model,quote)+1,0)+1,0) sleep(-1) } var/list/old_turf_underlays[0] var/old_turf_density var/old_turf_opacity /*The old_turf variables store information about turfs instantiated in this location/iteration. This is done to approximate the layered turf effect of DM's map editor. An image of each turf is stored in old_turf_underlays[], and is later added to the new turf's underlays. */ for(var/dpos=1;dpos!=0;dpos=findtext(model,",",dpos,0)+1){ /*Loop: Identifies each object's data, instantiates it, and reconstitues it's fields. - Each iteration represents one object's data, including type path and field values. */ var/full_def = copytext(model,dpos,findtext(model,",",dpos,0)) var/atom_def = text2path(copytext(full_def,1,findtext(full_def,"{"))) var/list/attributes[0] if(findtext(full_def,"{")){ full_def = copytext(full_def,1,length(full_def)) for(var/apos=findtext(full_def,"{")+1;apos!=0;apos=findtext(full_def,";",apos,0)+1){ //Loop: Identifies each attribute/value pair, and stores it in attributes[]. attributes.Add(copytext(full_def,apos,findtext(full_def,";",apos,0))) if(!findtext(copytext(full_def,apos,0),";")){break} sleep(-1) } } //Construct attributes associative list var/list/fields = new(0) for(var/index=1;index<=attributes.len;index++){ var/trim_left = trim_text(copytext(attributes[index],1,findtext(attributes[index],"="))) var/trim_right = trim_text(copytext(attributes[index],findtext(attributes[index],"=")+1,0)) //Check for string if(findtext(trim_right,"~")){ var/reference_index = copytext(trim_right,findtext(trim_right,"~")+1,0) trim_right=text_strings[text2num(reference_index)] } //Check for number else if(isnum(text2num(trim_right))){ trim_right = text2num(trim_right) } //Check for file else if(copytext(trim_right,1,2) == "'"){ trim_right = file(copytext(trim_right,2,length(trim_right))) } fields[trim_left] = trim_right } //End construction //Begin Instanciation var/atom/instance var/dmm_suite/preloader/_preloader = new(fields) if(ispath(atom_def,/area)){ instance = locate(atom_def) instance.contents.Add(locate(xcrd,ycrd,zcrd)) } else if(ispath(atom_def,/turf)){ var/turf/old_turf = locate(xcrd,ycrd,zcrd) if(old_turf.density){old_turf_density = 1} if(old_turf.opacity){old_turf_opacity = 1} if(old_turf.icon){ var/image/old_turf_image = image(old_turf.icon,null,old_turf.icon_state,old_turf.layer,old_turf.dir) old_turf_underlays.Add(old_turf_image) } instance = new atom_def(old_turf, _preloader) for(var/inverse_index=old_turf_underlays.len;inverse_index;inverse_index--){ var/image/image_underlay = old_turf_underlays[inverse_index] image_underlay.loc = instance instance.underlays.Add(image_underlay) } if(!instance.density){instance.density = old_turf_density} if(!instance.opacity){instance.opacity = old_turf_opacity} } if(_preloader && instance){ _preloader.load(instance) } //End Instanciation if(!findtext(copytext(model,dpos,0),",")){break} sleep(-1) } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// for(var/dpos=1;dpos!=0;dpos=findtext(model,",",dpos,0)+1) { /*Loop: Identifies each object's data, instantiates it, and reconstitues it's fields. - Each iteration represents one object's data, including type path and field values. */ var/full_def = copytext(model,dpos,findtext(model,",",dpos,0)) var/atom_def = text2path(copytext(full_def,1,findtext(full_def,"{"))) var/list/attributes[0] if(findtext(full_def,"{")){ full_def = copytext(full_def,1,length(full_def)) for(var/apos=findtext(full_def,"{")+1;apos!=0;apos=findtext(full_def,";",apos,0)+1){ //Loop: Identifies each attribute/value pair, and stores it in attributes[]. attributes.Add(copytext(full_def,apos,findtext(full_def,";",apos,0))) if(!findtext(copytext(full_def,apos,0),";")){break} sleep(-1) } } //Construct attributes associative list var/list/fields = new(0) for(var/index=1;index<=attributes.len;index++){ var/trim_left = trim_text(copytext(attributes[index],1,findtext(attributes[index],"="))) var/trim_right = trim_text(copytext(attributes[index],findtext(attributes[index],"=")+1,0)) //Check for string if(findtext(trim_right,"~")){ var/reference_index = copytext(trim_right,findtext(trim_right,"~")+1,0) trim_right=text_strings[text2num(reference_index)] } //Check for number else if(isnum(text2num(trim_right))){ trim_right = text2num(trim_right) } //Check for file else if(copytext(trim_right,1,2) == "'"){ trim_right = file(copytext(trim_right,2,length(trim_right))) } fields[trim_left] = trim_right } //End construction //Begin Instanciation var/atom/instance var/dmm_suite/preloader/_preloader = new(fields) if(!ispath(atom_def,/area) && !ispath(atom_def,/turf)) { instance = new atom_def(locate(xcrd,ycrd,zcrd), _preloader) } if(_preloader && instance) { _preloader.load(instance) } //End Instanciation if(!findtext(copytext(model,dpos,0),",")){break} sleep(-1) } } trim_text(var/what as text){ while(length(what) && findtext(what," ",1,2)){ what=copytext(what,2,0) } while(length(what) && findtext(what," ",length(what),0)){ what=copytext(what,1,length(what)) } return what } } } atom/New(atom/loc, dmm_suite/preloader/_dmm_preloader){ if(istype(_dmm_preloader, /dmm_suite/preloader)){ _dmm_preloader.load(src) } . = ..() } dmm_suite{ preloader{ parent_type = /datum var{ list/attributes } New(list/the_attributes){ .=..() if(!the_attributes.len){ Del()} attributes = the_attributes } proc{ load(atom/what){ for(var/attribute in attributes){ what.vars[attribute] = attributes[attribute] } Del() } } } }