Skip to main content

Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
TagsGame Engines

GMRoomPack

Package GameMaker rooms and load them as you please · By YellowAfterlife

Getting Started & Unknown Function/script

A topic by ArcJamie created Aug 03, 2019 Views: 476 Replies: 5
Viewing posts 1 to 2

Good evening from the UK!

My main goal is to replace placeholder objects in the room by loading them via GMRoomPack, and make a set of separate islands the player can explore. I may be putting things in the wrong places here, but it says that functions such as room_pack_load_file and room_pack_load_string are unknown, and doesn't let the game run. I've tried reading through the cheat sheet, to no avail so far.

I've gotten as far as creating obj_blank and placing room_pack_blank_object = obj_blank; in a game start event. I'm able to save rooms to json files and scripts without an issue. It's just figuring out how to actually load them onto the placeholder objects. 

Any help or guidance would be appreciated!

Developer

Check if you had imported the extension into your project correctly (must show up under Extensions in resource tree)? I don't think there's any other way to have those functions missing.

Ah! It seems that it wasn't imported correctly the first time around. It works!

The main thing that led to me buying your extension was:  "to generate placeholders, then insert a random room from a subset in place of each of them".

My system involves 43 red squares and I wish to do just that, replace each of these into a random room from a script. How would I go about replacing each of these objects? Right now I have it so the system loads rooms into specific rooms, however it seems like all of the rooms I packed into a script load at once. 

var json_rooms = scr_rooms(); // generated rooms stored in the script
// pick a random room name from the map:
var name = ds_map_find_first(json_rooms);
repeat (irandom_range(0, ds_map_size(json_rooms) - 1)) {
    name = ds_map_find_next(json_rooms, name);
}

if room = Temporal_Gardens {
// and load that:
room_pack_load_map(json_rooms[?name]);
}
// and when you're done:
ds_map_destroy(json_rooms);


Sorry if these seem like really basic questions. I'm still around beginner level and trying to understand this new system.

Developer

Here's what the sample seen in the first screenshot does on room start in a controller object:

var json = scr_rts(); // generated from rooms starting with rt_
room_pack_blank_object = obj_blank;
randomize();
with (obj_room) { // obj_room is placeholder object
    // pick a random room name from the map:
    var name = ds_map_find_first(json);
    repeat (irandom_range(0, ds_map_size(json) - 1)) {
        name = ds_map_find_next(json, name);
    }
    // and load that:
    room_pack_load_map(json[?name], x, y,
        room_pack_flag_instances|room_pack_flag_tiles|room_pack_flag_sprites);
}
ds_map_destroy(json);

Also make sure not to accidentally insert your outer room into itself (you can specify the filter-prefix for this reason)

This definitely solved that issue! Thank you so much, this means more than you know since I've been trying to get a system like this working for many days!

Theres another smaller issue that was created from the code you gave me though. I had this piece of code in my chunks placeholder step event:

//Set 3 random instances as chest sprites
while (global.chest_minimum < 3) {
    inst = instance_find(chunks,irandom(instance_number(chunks)-1));
    if (inst.sprite_index != spr_chunks_chest) {
        inst.sprite_index = spr_chunks_chest;
    }
global.chest_minimum++;
}

It seems that because GMRoomPack activates on room start, it doesn't give the placeholder object time to change its sprite, therefore I'm not able to target specific sprites. I can easily target different sprites and say: 

with(obj_room) {

if sprite_index = chest {

//activate the code you sent me, but for a script containing chest rooms

} //and then and else if statement for a different sprite index, for a script containing normal rooms.

I've tried different variations, but there's either errors or the code just doesn't replace the placeholders. For context, I want rooms like chests and shops which ALWAYS appear on a map (like in Binding of Isaac, or Enter the Gungeon). How would you approach doing this? 

Developer

You could only run GMRoomPack once global.chest_minimum is 3, or run that code in Create event before running GMRoomPack - after all, it's a one-time thing.