Jump to content

tipun

Modders
  • Posts

    99
  • Joined

  • Last visited

Posts posted by tipun

  1. Alternatively, you can create spells that use opcode # 326 (326) Apply Effects List to set a variable based on the stat value. Which will be applied once every 6 seconds (or more often, or less often).
    And through the script, check this value and set the SetTokenGlobal action (You can use Switch().).
    True, all this will need to be done for each parameter for each party member. And add variable check with OnCreation ().
    Until I thought of another option.

  2. Link in the first post of this thread. Unfortunately, I don't have much time to do modding at the moment. But there were extra messages when applying effects that appeared in version 2.6. I will try to deal with them. And I will try to add new subraces as soon as possible.

  3. On 9/2/2021 at 8:00 PM, RelentlessImp said:

    ERROR: cannot resolve trigger 0x40e0

    ERROR: cannot resolve trigger 0xeb

    Most likely, Transition is not the problem. I think there is a mod after Transition that has poor EE compatibility (or not compatibility at all). And it replaces the trigger.ids file. Therefore, EET_end cannot find the triggers it needs.

  4. 16 hours ago, Guest Mike said:

    The question remains, are the changes to the actor names by Infinity Animations really needed?

    They are not needed. They break the quest with the prisoners and Gityanki (I don't remember how it is written in English) in the city of the Illithids. Because the Override Script Name checkbox is used there. Because of what scripts do not work. Perhaps it is somewhere else.

    Sorry for my english.

  5. @Cahir

    Thank you for your feedback.

    Improvements suggestions:
    1. I didn't really understand this sentence. English is not my native language.
    2. As far as I remember, on the character creation screen, the text is generated automatically. Therefore, it is unlikely.
    3. It can be done. But I will have to write more code during installation.
    4. I know about aasimars and tieflings (I took from IWD2, there they are subraces of people). But new races with a choice when creating a character cannot be added. Therefore, Planetouched can only be created as a subrace.

    Addon suggestions:
    I'm going to add new subraces, but a little later. Now, unfortunately, I don't have time.

  6. I finally made it to BG2EE version 2.6.6.0. I will try to fix the problems that arose with this version of the game.


    @Guest steve
    I don't quite understand what is meant by ancestry (my English is poor). I took all subraces from IWD2, and when I create new ones, I will need the help of the Internet community. I'm still closer to GURPS in board games than to DND. And I would like to clarify the question.

    @Endarire

    When the version of the game was 2.5.16.6 the mod was compatible with the games BG1EE, BG2EE, EET and IWD1EE. I received version 2.6.6.0 of games only yesterday. I will check. But I think that it will also be compatible with all the games of the new version. I skimmed the ui.menu and the changes are not very big. After all, the code of my mod is looking for places that seem to have already remained unchanged.

  7. New door at the area. I replaced the ship on the Waukeen Promenade with a ship from IWD2. Made it like a door. Everything works fine in the game. But Near Infinity now shows an error when trying to open a wed file.
    Although I even manually checked all the offsets. Maybe you missed something?
    Or maybe you can tell me somewhere I can find functions for editing wed files.

     

    The code I used to edit the wed files:

    Spoiler
    DEFINE_PATCH_FUNCTION FC_GET_XY_COORDINATE
    	INT_VAR num = 0
    	RET     x1 y1
    BEGIN
    	y1 = ( num >> 16 )
    	x1 = num - ( y1 << 16 )
    END
    
    DEFINE_PATCH_FUNCTION ZZ_ADD_WED_DOOR
    	INT_VAR
    		is_door = 1
    		//tile_0, tile_1 etc. (lookup tiles)
    		poly_opened_cnt = 0
    		poly_closed_cnt = 0
    		//	1, flags_2 etc. ( Count = poly_opened_cnt + poly_closed_cnt )
    		//vertex_cnt_1, vertex_cnt_2 etc. ( Count = poly_opened_cnt + poly_closed_cnt )
    		//vertex_1, vertex_2 etc.
    		LastTile = 0
    		Count = 0
    		overlay_idx = 0
    	STR_VAR
    		name = ""
    	RET
    BEGIN
    	PATCH_IF ( is_door > 1 ) OR ( is_door < 0 ) BEGIN SET is_door = 1 END
    	LPM ZZ_READ_WED_OFFSETS
    	LPM ZZ_CREATE_DOOR_Z
    	LPM ZZ_CREATE_DOOR
    END
    
    DEFINE_PATCH_FUNCTION ZZ_GET_POLY_MINMAX_COORDS
    	STR_VAR
    		str = ""
    	RET
    		minX maxX minY maxY
    BEGIN
    	SET minX = 10000 SET maxX = 0 SET minY = 10000 SET maxY = 0
    	SET lng = STRING_LENGTH ~%str%~
    	FOR ( j = 0 ; j < lng ; j = j + 4 ) BEGIN
    		INNER_PATCH_SAVE str ~%str%~ BEGIN
    			READ_SHORT 0x00 + j mnXi
    			READ_SHORT 0x02 + j mnYi
    		END
    		PATCH_IF ( mnXi <= minX ) BEGIN SET minX = mnXi END
    		PATCH_IF ( mnXi >= maxX ) BEGIN SET maxX = mnXi END
    		PATCH_IF ( mnYi <= minY ) BEGIN SET minY = mnYi END
    		PATCH_IF ( mnYi >= maxY ) BEGIN SET maxY = mnYi END
    	END
    END
    
    DEFINE_PATCH_MACRO ZZ_READ_WED_OFFSETS BEGIN
    	READ_LONG 0x08 overlay_num
    	READ_LONG 0x0c doors_num
    	READ_LONG 0x10 overlay_off
    	READ_LONG 0x14 sec_header_off
    	READ_LONG 0x18 doors_off
    	READ_LONG 0x1c door_tmap_lkup_off
    	READ_LONG sec_header_off + 0x0c wall_group_off
    	READ_LONG sec_header_off + 0x00 wall_poly_num
    	READ_LONG sec_header_off + 0x04 wall_poly_off
    	READ_LONG doors_off + 0x12 door_poly_off
    	READ_LONG overlay_off + 0x10 tilemap_offset
    	READ_LONG overlay_off + 0x14 tilemap_lookup_offset
    	SET door_poly_num = 0
    	SET vertex_door_num = 0
    	SET tmap_lkp = 0
    	FOR ( i = 0 ; i < doors_num ; ++i ) BEGIN
    		READ_SHORT doors_off + i * 0x1a + 0x0e door_poly_open
    		READ_SHORT doors_off + i * 0x1a + 0x10 door_poly_closed
    		SET door_poly_all = door_poly_open + door_poly_closed
    		SET door_poly_num = door_poly_num + door_poly_open + door_poly_closed
    		SET ddr_off = doors_off + i * 0x1a
    		READ_LONG ddr_off + 0x12 offs
    		FOR ( j = 0 ; j < door_poly_all ; ++j ) BEGIN
    			READ_LONG offs + j * 0x12 + 0x04 vtx
    			SET vertex_door_num = vertex_door_num + vtx
    		END
    		READ_SHORT doors_off + i * 0x1a + 0x0a tml
    		READ_SHORT doors_off + i * 0x1a + 0x0c tmz
    		SET tmap_lkp = tml + tmz
    	END
    	READ_LONG sec_header_off + 0x10 wall_poly_lkup_off
    	READ_LONG sec_header_off + 0x08 vertex_wall_off
    	READ_LONG door_poly_off + 0x00 vertex_wall_num
    	SET vertex_door_off = vertex_wall_off + vertex_wall_num * 0x04
    END
    
    DEFINE_PATCH_MACRO ZZ_CREATE_DOOR BEGIN
    	SET length_first = 0x1a
    	SET len = STRING_LENGTH ~%door_tmap_lkup%~
    	SET length_second = length_first + len
    	SET len = STRING_LENGTH ~%polygons%~
    	SET length_third = length_second + len
    	SET length_vertex = STRING_LENGTH ~%vert%~
    	//vertex
    	SET offset = ~%SOURCE_SIZE%~
    	INSERT_BYTES offset length_vertex
    	WRITE_EVALUATED_ASCII offset ~%vert%~ ( length_vertex )
    	WRITE_LONG sec_header_off + 0x08 vertex_wall_off + length_third
    	//wall_poly_lkup
    	WRITE_LONG sec_header_off + 0x10 wall_poly_lkup_off + length_third
    	//door polygons
    	SET offset = wall_poly_lkup_off
    	SET len = STRING_LENGTH ~%polygons%~
    	INSERT_BYTES offset len
    	WRITE_EVALUATED_ASCII offset ~%polygons%~ ( len )
    	SET poly_offs = offset + length_second
    	//Walls
    	WRITE_LONG sec_header_off + 0x04 wall_poly_off + length_second
    	//Wall groups
    	WRITE_LONG sec_header_off + 0x0c wall_group_off + length_second
    	//Tilemap lookup
    	FOR ( i = 0 ; i < overlay_num ; ++i ) BEGIN
    		READ_LONG overlay_off + i * 0x18 + 0x14 tmap_lookup
    		WRITE_LONG overlay_off + i * 0x18 + 0x14 tmap_lookup + length_second
    	END
    	//door_tilemap_lookup
    	SET door_tilemap_lookup = tilemap_lookup_offset
    	SET len = STRING_LENGTH ~%door_tmap_lkup%~
    	INSERT_BYTES door_tilemap_lookup len
    	WRITE_EVALUATED_ASCII door_tilemap_lookup ~%door_tmap_lkup%~ ( len )
    	WRITE_LONG 0x1c door_tmap_lkup_off + length_first
    	//Overlay tilemap
    	FOR ( i = 0 ; i < overlay_num ; ++i ) BEGIN
    		READ_LONG overlay_off + i * 0x18 + 0x10 tmap_offset
    		WRITE_LONG overlay_off + i * 0x18 + 0x10 tmap_offset + length_first
    	END
    	//door
    	SET door_off = tilemap_offset
    	INSERT_BYTES door_off length_first
    	WRITE_EVALUATED_ASCII door_off ~%new_door%~ ( length_first )
    	WRITE_LONG door_off + 0x12 poly_offs
    	WRITE_LONG door_off + 0x16 poly_offs + poly_opened_cnt * 0x12
    	WRITE_LONG 0x0c doors_num + 1
    END
    
    DEFINE_PATCH_MACRO ZZ_CREATE_DOOR_Z BEGIN
    	//overlay
    	SPRINT door_tmap_lkup ~~
    	PATCH_IF ( VARIABLE_IS_SET $tile(0) ) BEGIN
    		PATCH_IF ( overlay_idx >= overlay_num ) BEGIN SET overlay_idx = overlay_num - 1 END
    		PATCH_IF ( overlay_idx < 0 ) BEGIN SET overlay_idx = 0 END
    		SET door_tmap_lkup_size = 0
    		FOR ( i = 0 ; i < 65536 ; ++i ) BEGIN
    			PATCH_IF ( VARIABLE_IS_SET $tile(~%i%~) ) BEGIN
    				SET cls_tile = LastTile + i
    				SET cur_tile = $tile(~%i%~)
    				READ_LONG overlay_off + overlay_idx * 0x18 + 0x10 tiled_object_offset
    				WRITE_SHORT tiled_object_offset + cur_tile * 0x0a + 0x04 cls_tile
    				INNER_PATCH_SAVE door_tmap_lkup ~%door_tmap_lkup%~ BEGIN
    					INSERT_BYTES door_tmap_lkup_size 2
    					WRITE_SHORT  door_tmap_lkup_size cur_tile
    					SET door_tmap_lkup_size = door_tmap_lkup_size + 2
    				END
    			END ELSE BEGIN SET i = 65536 END
    		END
    	END
    	//vertex
    	SPRINT vert ~~
    	SET vtxnum = 0
    	PATCH_IF ( VARIABLE_IS_SET $vertex(0) ) BEGIN
    		FOR ( i = 0 ; i < 65536 ; ++i ) BEGIN
    			PATCH_IF ( VARIABLE_IS_SET $vertex(~%i%~) ) BEGIN
    				INNER_PATCH_SAVE vert ~%vert%~ BEGIN
    					INSERT_BYTES i * 0x04 0x04
    					SET vvx = $vertex(~%i%~)
    					WRITE_LONG   i * 0x04 vvx
    					SET vtxnum = vtxnum + 1
    				END
    			END ELSE BEGIN SET i = 65536 END
    		END
    	END
    	//polygon
    	SPRINT polygons ~~
    	SET vtx = vertex_wall_num + vertex_door_num
    	SET vn = 0
    	SET poly_num = 0
    	PATCH_IF ( VARIABLE_IS_SET $vertex_cnt(0) ) BEGIN
    		FOR ( i = 0 ; i < 65536 ; ++i ) BEGIN
    			PATCH_IF ( VARIABLE_IS_SET $vertex_cnt(~%i%~) ) BEGIN
    				SPRINT polygon ~~
    				INNER_PATCH_SAVE polygon ~%polygon%~ BEGIN
    					INSERT_BYTES 0x00 0x12
    					WRITE_LONG 0x00 vtx
    					SET nvtx = $vertex_cnt(~%i%~)
    					WRITE_LONG 0x04 nvtx
    					SET vtx = vtx + nvtx
    					PATCH_IF ( VARIABLE_IS_SET $flags(~%i%~) ) BEGIN SET flg = $flags(~%i%~) END ELSE BEGIN SET flg = 0 END
    					WRITE_BYTE 0x08 flg
    					WRITE_BYTE 0x09 0xff
    					SET zn = nvtx * 4
    					INNER_PATCH_SAVE vert ~%vert%~ BEGIN
    						READ_ASCII vn * 0x04 abs ( zn )
    					END
    					LPF ZZ_GET_POLY_MINMAX_COORDS STR_VAR str = EVAL ~%abs%~ RET minX maxX minY maxY END
    					SET vn = vn + nvtx
    					WRITE_SHORT 0x0a minX
    					WRITE_SHORT 0x0c maxX
    					WRITE_SHORT 0x0e minY
    					WRITE_SHORT 0x10 maxY
    				END
    				SPRINT polygons ~%polygons%%polygon%~
    				SET poly_num = poly_num + 1
    			END ELSE BEGIN SET i = 65536 END
    		END
    	END
    	//door
    	SPRINT new_door ~~
    	INNER_PATCH_SAVE new_door ~%new_door%~ BEGIN
    		INSERT_BYTES 0x00 0x1a
    		WRITE_EVALUATED_ASCII 0x00 ~%name%~ ( 8 )
    		WRITE_SHORT 0x08 is_door
    		WRITE_SHORT 0x0a tmap_lkp
    		WRITE_SHORT 0x0c door_tmap_lkup_size / 2
    		WRITE_SHORT 0x0e poly_opened_cnt
    		WRITE_SHORT 0x10 poly_closed_cnt
    	END
    END

     

     

    Image0001.jpg

  8. Three functions:
    FC_EDIT_AREA_DOOR
    FC_EDIT_AREA_REGION
    FC_EDIT_AREA_CONTAINER

    They generally correspond to the standard weidu functions:
    ALTER_AREA_REGION
    ALTER_AREA_CONTAINER
    ALTER_AREA_DOOR
    but allow polygons to be modified. And the search for the desired structure occurs using a large number of parameters.

    Spoiler
    //BLOCK FC_UPDETE_AREA_OFFSETS
    DEFINE_PATCH_FUNCTION FC_UPDETE_AREA_OFFSETS
    	INT_VAR
    		num = 1
    	STR_VAR
    		type = actor //actor 0x110, trigger 0x0c4, spawn 0x0c8, entrance 0x068, container 0x0c0, item 0x014, vertex 0x004, ambient 0x0d4, variable 0x050, door 0x0c8, animation 0x04c, automap 0x034, projectile 0x01c
    	RET
    		done
    BEGIN
    	//BLOCK 
    	SET done = 0
    	READ_LONG  0x054 aco //actor_off
    	READ_LONG  0x05c tro //trigger_off
    	READ_LONG  0x060 spo //spawn_off
    	READ_LONG  0x068 eno //entrance_off
    	READ_LONG  0x070 coo //container_off
    	READ_LONG  0x078 ito //item_off
    	READ_LONG  0x07c veo //vertex_off
    	READ_LONG  0x084 amo //ambient_off
    	READ_LONG  0x088 vao //variable_off
    	READ_SHORT 0x090 ofo //object_flag_off
    	READ_LONG  0x0a0 exo //explored_off
    	READ_LONG  0x0a8 doo //door_off
    	READ_LONG  0x0b0 ano //animation_off
    	READ_LONG  0x0b8 too //tiled_off
    	READ_LONG  0x0bc soo //song_off
    	READ_LONG  0x0c0 reo //rest_off
    	READ_LONG  0x0c4 auo //automap_off
    	READ_LONG  0x0cc pro //projectile_off
    	PATCH_MATCH ~%type%~ WITH
    		~actor~      BEGIN SET size = num * 0x110 SET off = aco END
    		~trigger~    BEGIN SET size = num * 0x0c4 SET off = tro END
    		~spawn~      BEGIN SET size = num * 0x0c8 SET off = spo END
    		~entrance~   BEGIN SET size = num * 0x068 SET off = eno END
    		~container~  BEGIN SET size = num * 0x0c0 SET off = coo END
    		~item~       BEGIN SET size = num * 0x014 SET off = ito END
    		~vertex~     BEGIN SET size = num * 0x004 SET off = veo END
    		~ambient~    BEGIN SET size = num * 0x0d4 SET off = amo END
    		~variable~   BEGIN SET size = num * 0x050 SET off = vao END
    		~door~       BEGIN SET size = num * 0x0c8 SET off = doo END
    		~animation~  BEGIN SET size = num * 0x04c SET off = ano END
    		~automap~    BEGIN SET size = num * 0x034 SET off = auo END
    		~projectile~ BEGIN SET size = num * 0x01c SET off = pro END
    		DEFAULT
    			SET size = 0
    			SET off = 0
    	END
    	PATCH_IF ( size != 0 ) AND ( off != 0 ) BEGIN
    		PATCH_IF ( ~%type%~ STR_CMP ~actor~ )      AND ( aco >= off ) BEGIN WRITE_LONG  0x054 aco + size END
    		PATCH_IF ( ~%type%~ STR_CMP ~trigger~ )    AND ( tro >= off ) BEGIN WRITE_LONG  0x05c tro + size END
    		PATCH_IF ( ~%type%~ STR_CMP ~spawn~ )      AND ( spo >= off ) BEGIN WRITE_LONG  0x060 spo + size END
    		PATCH_IF ( ~%type%~ STR_CMP ~entrance~ )   AND ( eno >= off ) BEGIN WRITE_LONG  0x068 eno + size END
    		PATCH_IF ( ~%type%~ STR_CMP ~container~ )  AND ( coo >= off ) BEGIN WRITE_LONG  0x070 coo + size END
    		PATCH_IF ( ~%type%~ STR_CMP ~item~ )       AND ( ito >= off ) BEGIN WRITE_LONG  0x078 ito + size END
    		PATCH_IF ( ~%type%~ STR_CMP ~vertex~ )     AND ( veo >= off ) BEGIN WRITE_LONG  0x07c veo + size END
    		PATCH_IF ( ~%type%~ STR_CMP ~ambient~ )    AND ( amo >= off ) BEGIN WRITE_LONG  0x084 amo + size END
    		PATCH_IF ( ~%type%~ STR_CMP ~variable~ )   AND ( vao >= off ) BEGIN WRITE_LONG  0x088 vao + size END
    		PATCH_IF                                       ( ofo >= off ) BEGIN WRITE_SHORT 0x090 ofo + size END
    		PATCH_IF                                       ( exo >= off ) BEGIN WRITE_LONG  0x0a0 exo + size END
    		PATCH_IF ( ~%type%~ STR_CMP ~door~ )       AND ( doo >= off ) BEGIN WRITE_LONG  0x0a8 doo + size END
    		PATCH_IF ( ~%type%~ STR_CMP ~animation~ )  AND ( ano >= off ) BEGIN WRITE_LONG  0x0b0 ano + size END
    		PATCH_IF                                       ( too >= off ) BEGIN WRITE_LONG  0x0b8 too + size END
    		PATCH_IF                                       ( soo >= off ) BEGIN WRITE_LONG  0x0bc soo + size END
    		PATCH_IF                                       ( reo >= off ) BEGIN WRITE_LONG  0x0c0 reo + size END
    		PATCH_IF ( ~%type%~ STR_CMP ~automap~ )    AND ( auo >= off ) BEGIN WRITE_LONG  0x0c4 auo + size END
    		PATCH_IF ( ~%type%~ STR_CMP ~projectile~ ) AND ( pro >= off ) BEGIN WRITE_LONG  0x0cc pro + size END
    		SET done = 1
    	END
    	//BLOCKEND
    END
    //BLOCKEND
    
    //BLOCK FC_GET_XY_COORDINATE
    DEFINE_PATCH_FUNCTION FC_GET_XY_COORDINATE
    	INT_VAR num = 0
    	RET     x1 y1
    BEGIN
    	y1 = ( num >> 16 )
    	x1 = num - ( y1 << 16 )
    END
    //BLOCKEND
    
    //BLOCK FC_UPDATE_VERTEX_INDEX
    DEFINE_PATCH_FUNCTION FC_UPDATE_VERTEX_INDEX
    	INT_VAR skip = 0 numx = 100000 adds = 100000
    	STR_VAR type = trigger //trigger, container, door
    BEGIN
    	READ_SHORT 0x5a type_cnt
    	READ_LONG  0x5c type_off
    	PATCH_IF ( type_cnt > 0 ) BEGIN
    		FOR ( i = 0 ; i < type_cnt ; ++i ) BEGIN
    			PATCH_IF ( ~%type%~ STR_EQ ~trigger~ ) AND ( i = skip ) BEGIN END ELSE BEGIN
    				READ_LONG type_off + i * 0x0c4 + 0x2c f_vert
    				PATCH_IF ( f_vert >= numx ) BEGIN WRITE_LONG type_off + i * 0x0c4 + 0x2c f_vert + adds END
    			END
    		END
    	END
    	READ_SHORT 0x74 type_cnt
    	READ_LONG  0x70 type_off
    	PATCH_IF ( type_cnt > 0 ) BEGIN
    		FOR ( i = 0 ; i < type_cnt ; ++i ) BEGIN
    			PATCH_IF ( ~%type%~ STR_EQ ~container~ ) AND ( i = skip ) BEGIN END ELSE BEGIN
    				READ_LONG type_off + i * 0x0c0 + 0x50 f_vert
    				PATCH_IF ( f_vert >= numx ) BEGIN WRITE_LONG type_off + i * 0x0c0 + 0x50 f_vert + adds END
    			END
    		END
    	END
    	READ_LONG  0xa4 type_cnt
    	READ_LONG  0xa8 type_off
    	PATCH_IF ( type_cnt > 0 ) BEGIN
    		FOR ( i = 0 ; i < type_cnt ; ++i ) BEGIN
    			PATCH_IF ( ~%type%~ STR_EQ ~door~ ) AND ( i = skip ) BEGIN END ELSE BEGIN
    				READ_LONG type_off + i * 0x0c8 + 0x2c f_vert
    				PATCH_IF ( f_vert >= numx ) BEGIN WRITE_LONG type_off + i * 0x0c8 + 0x2c f_vert + adds END
    				READ_LONG type_off + i * 0x0c8 + 0x34 f_vert
    				PATCH_IF ( f_vert >= numx ) BEGIN WRITE_LONG type_off + i * 0x0c8 + 0x34 f_vert + adds END
    				READ_LONG type_off + i * 0x0c8 + 0x48 f_vert
    				PATCH_IF ( f_vert >= numx ) BEGIN WRITE_LONG type_off + i * 0x0c8 + 0x48 f_vert + adds END
    				READ_LONG type_off + i * 0x0c8 + 0x50 f_vert
    				PATCH_IF ( f_vert >= numx ) BEGIN WRITE_LONG type_off + i * 0x0c8 + 0x50 f_vert + adds END
    			END
    		END
    	END
    END
    //BLOCKEND
    
    //BLOCK FC_EDIT_AREA_DOOR
    DEFINE_PATCH_FUNCTION FC_EDIT_AREA_DOOR
    	INT_VAR
    		flags           = "-1"
    		hp              = "-1"
    		ac              = "-1"
    		cursor_idx      = "-1"
    		trap_detect_dif = "-1"
    		trap_remove_dif = "-1"
    		is_trapped      = "-1"
    		is_trap_detect  = "-1"
    		launch_x        = "-1"
    		launch_y        = "-1"
    		detect_diff     = "-1"
    		lock_diff       = "-1"
    		open_loc_x      = "-1"
    		open_loc_y      = "-1"
    		close_loc_x     = "-1"
    		close_loc_y     = "-1"
    		unlock_message  = 99999999
    		speaker_name    = 99999999
    		//vertex_open_X
    		//vertex_closed_X
    		//impeded_open_X
    		//impeded_closed_X
    		vertex_open_0 = "-1"
    		vertex_closed_0 = "-1"
    		impeded_open_0 = "-1"
    		impeded_closed_0 = "-1"
    		// AND ( $vertex(0) >= 0 ) 
    	STR_VAR
    		match_name      = "same"
    		match_key       = "same"
    		match_script    = "same"
    		name            = "same"
    		doorId          = "same"
    		open_sound      = "same"
    		close_sound     = "same"
    		key             = "same"
    		script          = "same"
    		travel_trigger  = "same"
    		dialogue        = "same"
    	RET
    		done
    BEGIN
    	//BLOCK 
    	SET done = 0
    	SET match = 0
    	READ_LONG  0x0a4 ~d_cnt~
    	READ_LONG  0x0a8 ~d_off~
    	PATCH_IF ( is_trapped > 1 )     BEGIN SET is_trapped = 1     END
    	PATCH_IF ( is_trap_detect > 1 ) BEGIN SET is_trap_detect = 1 END
    	PATCH_IF ( d_cnt > 0 ) BEGIN
    		FOR ( i = 0 ; i < d_cnt ; ++i ) BEGIN
    			SET offset = d_off + i * 0xc8
    			PATCH_IF ( ~%match_name%~ STR_CMP ~same~ ) BEGIN
    				READ_ASCII offset d_name (32) NULL
    				PATCH_IF ( ~%match_name%~ STR_EQ ~%d_name%~ ) BEGIN SET match = 1 END ELSE BEGIN SET match = 0 END
    			END
    			PATCH_IF ( ~%match_key%~ STR_CMP ~same~ ) BEGIN
    				READ_ASCII offset + 0x78 d_key (8) NULL
    				PATCH_IF ( ~%match_key%~ STR_EQ ~%d_key%~ ) BEGIN SET match = 1 END ELSE BEGIN SET match = 0 END
    			END
    			PATCH_IF ( ~%match_script%~ STR_CMP ~same~ ) BEGIN
    				READ_ASCII offset + 0x80 d_scr (8) NULL
    				PATCH_IF ( ~%match_script%~ STR_EQ ~%d_scr%~ ) BEGIN SET match = 1 END ELSE BEGIN SET match = 0 END
    			END
    			PATCH_IF (match) BEGIN SET door_pos = i SET i = d_cnt SET patch_offset = offset END
    		END
    	END
    	PATCH_IF (match) BEGIN
    		PATCH_IF ( ~%name%~           STR_CMP ~same~ ) BEGIN WRITE_ASCIIE patch_offset        ~%name%~           (32) END
    		PATCH_IF ( ~%doorId%~         STR_CMP ~same~ ) BEGIN WRITE_ASCIIE patch_offset + 0x20 ~%doorId%~         (8)  END
    		PATCH_IF ( ~%flags%~ >= 0 )                    BEGIN WRITE_LONG   patch_offset + 0x28 ~%flags%~               END
    		PATCH_IF ( ~%hp%~ >= 0 )                       BEGIN WRITE_SHORT  patch_offset + 0x54 ~%hp%~                  END
    		PATCH_IF ( ~%ac%~ >= 0 )                       BEGIN WRITE_SHORT  patch_offset + 0x56 ~%ac%~                  END
    		PATCH_IF ( ~%open_sound%~     STR_CMP ~same~ ) BEGIN WRITE_ASCIIE patch_offset + 0x58 ~%open_sound%~     (8)  END
    		PATCH_IF ( ~%close_sound%~    STR_CMP ~same~ ) BEGIN WRITE_ASCIIE patch_offset + 0x60 ~%close_sound%~    (8)  END
    		PATCH_IF ( ~%cursor_idx%~ >= 0 )               BEGIN WRITE_LONG   patch_offset + 0x68 ~%cursor_idx%~          END
    		PATCH_IF ( ~%trap_detect_dif%~ >= 0 )          BEGIN WRITE_SHORT  patch_offset + 0x6c ~%trap_detect_dif%~     END
    		PATCH_IF ( ~%trap_remove_dif%~ >= 0 )          BEGIN WRITE_SHORT  patch_offset + 0x6e ~%trap_remove_dif%~     END
    		PATCH_IF ( ~%is_trapped%~ >= 0 )               BEGIN WRITE_SHORT  patch_offset + 0x70 ~%is_trapped%~          END
    		PATCH_IF ( ~%is_trap_detect%~ >= 0 )           BEGIN WRITE_SHORT  patch_offset + 0x72 ~%is_trap_detect%~      END
    		PATCH_IF ( ~%launch_x%~ >= 0 )                 BEGIN WRITE_SHORT  patch_offset + 0x74 ~%launch_x%~            END
    		PATCH_IF ( ~%launch_y%~ >= 0 )                 BEGIN WRITE_SHORT  patch_offset + 0x76 ~%launch_y%~            END
    		PATCH_IF ( ~%key%~            STR_CMP ~same~ ) BEGIN WRITE_ASCIIE patch_offset + 0x78 ~%key%~            (8)  END
    		PATCH_IF ( ~%script%~         STR_CMP ~same~ ) BEGIN WRITE_ASCIIE patch_offset + 0x80 ~%script%~         (8)  END
    		PATCH_IF ( ~%detect_diff%~ >= 0 )              BEGIN WRITE_LONG   patch_offset + 0x88 ~%detect_diff%~         END
    		PATCH_IF ( ~%lock_diff%~ >= 0 )                BEGIN WRITE_LONG   patch_offset + 0x8c ~%lock_diff%~           END
    		PATCH_IF ( ~%open_loc_x%~ >= 0 )               BEGIN WRITE_SHORT  patch_offset + 0x90 ~%open_loc_x%~          END
    		PATCH_IF ( ~%open_loc_y%~ >= 0 )               BEGIN WRITE_SHORT  patch_offset + 0x92 ~%open_loc_y%~          END
    		PATCH_IF ( ~%close_loc_x%~ >= 0 )              BEGIN WRITE_SHORT  patch_offset + 0x94 ~%close_loc_x%~         END
    		PATCH_IF ( ~%close_loc_y%~ >= 0 )              BEGIN WRITE_SHORT  patch_offset + 0x96 ~%close_loc_y%~         END
    		PATCH_IF ( ~%unlock_message%~ != 99999999 )    BEGIN WRITE_LONG   patch_offset + 0x98 ~%unlock_message%~      END
    		PATCH_IF ( ~%travel_trigger%~ STR_CMP ~same~ ) BEGIN WRITE_ASCIIE patch_offset + 0x9c ~%travel_trigger%~ (24) END
    		PATCH_IF ( ~%speaker_name%~   != 99999999 )    BEGIN WRITE_LONG   patch_offset + 0xb4 ~%speaker_name%~        END
    		PATCH_IF ( ~%dialogue%~       STR_CMP ~same~ ) BEGIN WRITE_ASCIIE patch_offset + 0xb8 ~%dialogue%~       (8)  END
    		//vertex_open_X
    		PATCH_IF ( VARIABLE_IS_SET $vertex_open(0) AND ( $vertex_open(0) >= 0 ) ) BEGIN
    			READ_LONG  patch_offset + 0x2c vertex_first
    			READ_SHORT patch_offset + 0x30 vertex_cnt
    			SET deleted_vertex = 0 - vertex_cnt
    			READ_LONG  0x7c all_vertex_off
    			READ_SHORT 0x80 all_vertex_cnt
    			SET v_off = all_vertex_off + vertex_first * 0x004
    			SET num_v = 0
    			DELETE_BYTES v_off vertex_cnt * 0x004
    			SET x_bounding_left = 10000
    			SET x_bounding_top  = 10000
    			SET x_bounding_right  = 0
    			SET x_bounding_bottom = 0
    			FOR ( i = 0 ; i < 65535 ; ++i ) BEGIN
    				PATCH_IF ( VARIABLE_IS_SET $vertex_open(~%i%~) ) BEGIN
    					SET v_num = $vertex_open(~%i%~)
    					INSERT_BYTES v_off + i * 0x004 0x004
    					WRITE_LONG   v_off + i * 0x004 v_num
    					LPF FC_GET_XY_COORDINATE INT_VAR num = v_num RET x1 y1 END
    					PATCH_IF ( x_bounding_left   > x1 ) BEGIN SET x_bounding_left   = x1 END
    					PATCH_IF ( x_bounding_top    > y1 ) BEGIN SET x_bounding_top    = y1 END
    					PATCH_IF ( x_bounding_right  < x1 ) BEGIN SET x_bounding_right  = x1 END
    					PATCH_IF ( x_bounding_bottom < y1 ) BEGIN SET x_bounding_bottom = y1 END
    					SET deleted_vertex = deleted_vertex + 1
    					SET num_v = num_v + 1
    				END ELSE BEGIN SET i = 65535 END
    			END
    			WRITE_SHORT 0x80 all_vertex_cnt + deleted_vertex
    			WRITE_SHORT patch_offset + 0x30 num_v
    			WRITE_SHORT patch_offset + 0x38 x_bounding_left
    			WRITE_SHORT patch_offset + 0x3a x_bounding_top
    			WRITE_SHORT patch_offset + 0x3c x_bounding_right
    			WRITE_SHORT patch_offset + 0x3e x_bounding_bottom
    			READ_LONG   patch_offset + 0x34 upd_vert_1
    			READ_LONG   patch_offset + 0x48 upd_vert_2
    			READ_LONG   patch_offset + 0x50 upd_vert_3
    			PATCH_IF ( upd_vert_1 >= vertex_first ) BEGIN WRITE_LONG patch_offset + 0x34 upd_vert_1 + deleted_vertex END
    			PATCH_IF ( upd_vert_2 >= vertex_first ) BEGIN WRITE_LONG patch_offset + 0x48 upd_vert_2 + deleted_vertex END
    			PATCH_IF ( upd_vert_3 >= vertex_first ) BEGIN WRITE_LONG patch_offset + 0x50 upd_vert_3 + deleted_vertex END
    			LPF FC_UPDATE_VERTEX_INDEX
    				INT_VAR skip = door_pos numx = vertex_first adds = deleted_vertex
    				STR_VAR type = door
    			END
    			LPF FC_UPDETE_AREA_OFFSETS INT_VAR num = deleted_vertex STR_VAR type = vertex END
    			CLEAR_ARRAY vertex_open
    		END
    		//vertex_closed_X
    		PATCH_IF ( VARIABLE_IS_SET $vertex_closed(0) AND ( $vertex_closed(0) >= 0 ) ) BEGIN
    			READ_LONG  patch_offset + 0x34 vertex_first
    			READ_SHORT patch_offset + 0x32 vertex_cnt
    			SET deleted_vertex = 0 - vertex_cnt
    			READ_LONG  0x7c all_vertex_off
    			READ_SHORT 0x80 all_vertex_cnt
    			SET v_off = all_vertex_off + vertex_first * 0x004
    			SET num_v = 0
    			DELETE_BYTES v_off vertex_cnt * 0x004
    			SET x_bounding_left = 10000
    			SET x_bounding_top  = 10000
    			SET x_bounding_right  = 0
    			SET x_bounding_bottom = 0
    			FOR ( i = 0 ; i < 65535 ; ++i ) BEGIN
    				PATCH_IF ( VARIABLE_IS_SET $vertex_closed(~%i%~) ) BEGIN
    					SET v_num = $vertex_closed(~%i%~)
    					INSERT_BYTES v_off + i * 0x004 0x004
    					WRITE_LONG   v_off + i * 0x004 v_num
    					LPF FC_GET_XY_COORDINATE INT_VAR num = v_num RET x1 y1 END
    					PATCH_IF ( x_bounding_left   > x1 ) BEGIN SET x_bounding_left   = x1 END
    					PATCH_IF ( x_bounding_top    > y1 ) BEGIN SET x_bounding_top    = y1 END
    					PATCH_IF ( x_bounding_right  < x1 ) BEGIN SET x_bounding_right  = x1 END
    					PATCH_IF ( x_bounding_bottom < y1 ) BEGIN SET x_bounding_bottom = y1 END
    					SET deleted_vertex = deleted_vertex + 1
    					SET num_v = num_v + 1
    				END ELSE BEGIN SET i = 65535 END
    			END
    			WRITE_SHORT 0x80 all_vertex_cnt + deleted_vertex
    			WRITE_SHORT patch_offset + 0x32 num_v
    			WRITE_SHORT patch_offset + 0x40 x_bounding_left
    			WRITE_SHORT patch_offset + 0x42 x_bounding_top
    			WRITE_SHORT patch_offset + 0x44 x_bounding_right
    			WRITE_SHORT patch_offset + 0x46 x_bounding_bottom
    			READ_LONG   patch_offset + 0x2c upd_vert_1
    			READ_LONG   patch_offset + 0x48 upd_vert_2
    			READ_LONG   patch_offset + 0x50 upd_vert_3
    			PATCH_IF ( upd_vert_1 >= vertex_first ) BEGIN WRITE_LONG patch_offset + 0x2c upd_vert_1 + deleted_vertex END
    			PATCH_IF ( upd_vert_2 >= vertex_first ) BEGIN WRITE_LONG patch_offset + 0x48 upd_vert_2 + deleted_vertex END
    			PATCH_IF ( upd_vert_3 >= vertex_first ) BEGIN WRITE_LONG patch_offset + 0x50 upd_vert_3 + deleted_vertex END
    			LPF FC_UPDATE_VERTEX_INDEX
    				INT_VAR skip = door_pos numx = vertex_first adds = deleted_vertex
    				STR_VAR type = door
    			END
    			LPF FC_UPDETE_AREA_OFFSETS INT_VAR num = deleted_vertex STR_VAR type = vertex END
    			CLEAR_ARRAY vertex_closed
    		END
    		//impeded_open_X
    		PATCH_IF ( VARIABLE_IS_SET $impeded_open(0) AND ( $impeded_open(0) >= 0 ) ) BEGIN
    			READ_LONG  patch_offset + 0x48 vertex_first
    			READ_SHORT patch_offset + 0x4c vertex_cnt
    			SET deleted_vertex = 0 - vertex_cnt
    			READ_LONG  0x7c all_vertex_off
    			READ_SHORT 0x80 all_vertex_cnt
    			SET v_off = all_vertex_off + vertex_first * 0x004
    			SET num_v = 0
    			DELETE_BYTES v_off vertex_cnt * 0x004
    			FOR ( i = 0 ; i < 65535 ; ++i ) BEGIN
    				PATCH_IF ( VARIABLE_IS_SET $impeded_open(~%i%~) ) BEGIN
    					SET v_num = $impeded_open(~%i%~)
    					INSERT_BYTES v_off + i * 0x004 0x004
    					WRITE_LONG   v_off + i * 0x004 v_num
    					SET deleted_vertex = deleted_vertex + 1
    					SET num_v = num_v + 1
    				END ELSE BEGIN SET i = 65535 END
    			END
    			WRITE_SHORT 0x80 all_vertex_cnt + deleted_vertex
    			WRITE_SHORT patch_offset + 0x4c num_v
    			READ_LONG   patch_offset + 0x2c upd_vert_1
    			READ_LONG   patch_offset + 0x34 upd_vert_2
    			READ_LONG   patch_offset + 0x50 upd_vert_3
    			PATCH_IF ( upd_vert_1 >= vertex_first ) BEGIN WRITE_LONG patch_offset + 0x2c upd_vert_1 + deleted_vertex END
    			PATCH_IF ( upd_vert_2 >= vertex_first ) BEGIN WRITE_LONG patch_offset + 0x34 upd_vert_2 + deleted_vertex END
    			PATCH_IF ( upd_vert_3 >= vertex_first ) BEGIN WRITE_LONG patch_offset + 0x50 upd_vert_3 + deleted_vertex END
    			LPF FC_UPDATE_VERTEX_INDEX
    				INT_VAR skip = door_pos numx = vertex_first adds = deleted_vertex
    				STR_VAR type = door
    			END
    			LPF FC_UPDETE_AREA_OFFSETS INT_VAR num = deleted_vertex STR_VAR type = vertex END
    			CLEAR_ARRAY impeded_open
    		END
    		//impeded_closed_X
    		PATCH_IF ( VARIABLE_IS_SET $impeded_closed(0) AND ( $impeded_closed(0) >= 0 ) ) BEGIN
    			READ_LONG  patch_offset + 0x50 vertex_first
    			READ_SHORT patch_offset + 0x4e vertex_cnt
    			SET deleted_vertex = 0 - vertex_cnt
    			READ_LONG  0x7c all_vertex_off
    			READ_SHORT 0x80 all_vertex_cnt
    			SET v_off = all_vertex_off + vertex_first * 0x004
    			SET num_v = 0
    			DELETE_BYTES v_off vertex_cnt * 0x004
    			FOR ( i = 0 ; i < 65535 ; ++i ) BEGIN
    				PATCH_IF ( VARIABLE_IS_SET $impeded_closed(~%i%~) ) BEGIN
    					SET v_num = $impeded_closed(~%i%~)
    					INSERT_BYTES v_off + i * 0x004 0x004
    					WRITE_LONG   v_off + i * 0x004 v_num
    					SET deleted_vertex = deleted_vertex + 1
    					SET num_v = num_v + 1
    				END ELSE BEGIN SET i = 65535 END
    			END
    			WRITE_SHORT 0x80 all_vertex_cnt + deleted_vertex
    			WRITE_SHORT patch_offset + 0x4e num_v
    			READ_LONG   patch_offset + 0x2c upd_vert_1
    			READ_LONG   patch_offset + 0x34 upd_vert_2
    			READ_LONG   patch_offset + 0x48 upd_vert_3
    			PATCH_IF ( upd_vert_1 >= vertex_first ) BEGIN WRITE_LONG patch_offset + 0x2c upd_vert_1 + deleted_vertex END
    			PATCH_IF ( upd_vert_2 >= vertex_first ) BEGIN WRITE_LONG patch_offset + 0x34 upd_vert_2 + deleted_vertex END
    			PATCH_IF ( upd_vert_3 >= vertex_first ) BEGIN WRITE_LONG patch_offset + 0x48 upd_vert_3 + deleted_vertex END
    			LPF FC_UPDATE_VERTEX_INDEX
    				INT_VAR skip = door_pos numx = vertex_first adds = deleted_vertex
    				STR_VAR type = door
    			END
    			LPF FC_UPDETE_AREA_OFFSETS INT_VAR num = deleted_vertex STR_VAR type = vertex END
    			CLEAR_ARRAY impeded_closed
    		END
    		SET done = 1
    	END
    	//BLOCKEND
    END
    //BLOCKEND
    
    //BLOCK FC_EDIT_AREA_REGION
    DEFINE_PATCH_FUNCTION FC_EDIT_AREA_REGION
    	INT_VAR
    		region_type     = "-1"
    		trigger_value   = "-1"
    		cursor_idx      = "-1"
    		flags           = "-1"
    		info_text       = 99999999
    		trap_detect_dif = "-1"
    		trap_remove_dif = "-1"
    		is_trapped      = "-1"
    		is_trap_detect  = "-1"
    		launch_x        = "-1"
    		launch_y        = "-1"
    		alt_point_x     = "-1"
    		alt_point_y     = "-1"
    		//vertex_X
    		vertex_0        = "-1"
    	STR_VAR
    		match_name      = "same"
    		match_key       = "same"
    		match_script    = "same"
    		name            = "same"
    		dest_area       = "same"
    		entrance        = "same"
    		key             = "same"
    		script          = "same"
    	RET
    		done
    BEGIN
    	//BLOCK 
    	SET done = 0
    	SET match = 0
    	READ_SHORT 0x05a ~d_cnt~
    	READ_LONG  0x05c ~d_off~
    	PATCH_IF ( region_type > 2 )    BEGIN SET region_type = 1    END
    	PATCH_IF ( is_trapped > 1 )     BEGIN SET is_trapped = 1     END
    	PATCH_IF ( is_trap_detect > 1 ) BEGIN SET is_trap_detect = 1 END
    	PATCH_IF ( d_cnt > 0 ) BEGIN
    		FOR ( i = 0 ; i < d_cnt ; ++i ) BEGIN
    			SET offset = d_off + i * 0xc4
    			PATCH_IF ( ~%match_name%~ STR_CMP ~same~ ) BEGIN
    				READ_ASCII offset d_name (32) NULL
    				PATCH_IF ( ~%match_name%~ STR_EQ ~%d_name%~ ) BEGIN SET match = 1 END ELSE BEGIN SET match = 0 END
    			END
    			PATCH_IF ( ~%match_key%~ STR_CMP ~same~ ) BEGIN
    				READ_ASCII offset + 0x74 d_key (8) NULL
    				PATCH_IF ( ~%match_key%~ STR_EQ ~%d_key%~ ) BEGIN SET match = 1 END ELSE BEGIN SET match = 0 END
    			END
    			PATCH_IF ( ~%match_script%~ STR_CMP ~same~ ) BEGIN
    				READ_ASCII offset + 0x7c d_scr (8) NULL
    				PATCH_IF ( ~%match_script%~ STR_EQ ~%d_scr%~ ) BEGIN SET match = 1 END ELSE BEGIN SET match = 0 END
    			END
    			PATCH_IF (match) BEGIN SET door_pos = i SET i = d_cnt SET patch_offset = offset END
    		END
    	END
    	PATCH_IF (match) BEGIN
    		PATCH_IF ( ~%name%~      STR_CMP ~same~ ) BEGIN WRITE_ASCIIE patch_offset        ~%name%~       (32) END
    		PATCH_IF ( ~%region_type%~ >= 0 )         BEGIN WRITE_SHORT  patch_offset + 0x20 ~%region_type%~     END
    		PATCH_IF ( ~%trigger_value%~ >= 0 )       BEGIN WRITE_LONG   patch_offset + 0x30 ~%trigger_value%~   END
    		PATCH_IF ( ~%cursor_idx%~ >= 0 )          BEGIN WRITE_LONG   patch_offset + 0x34 ~%cursor_idx%~      END
    		PATCH_IF ( ~%dest_area%~ STR_CMP ~same~ ) BEGIN WRITE_ASCIIE patch_offset + 0x38 ~%dest_area%~  (8)  END
    		PATCH_IF ( ~%entrance%~  STR_CMP ~same~ ) BEGIN WRITE_ASCIIE patch_offset + 0x40 ~%entrance%~   (32) END
    		PATCH_IF ( ~%flags%~ >= 0 )               BEGIN WRITE_LONG   patch_offset + 0x60 ~%flags%~           END
    		PATCH_IF ( ~%info_text%~ != 99999999 )    BEGIN WRITE_LONG   patch_offset + 0x64 ~%info_text%~       END
    		PATCH_IF ( ~%trap_detect_dif%~ >= 0 )     BEGIN WRITE_SHORT  patch_offset + 0x68 ~%trap_detect_dif%~ END
    		PATCH_IF ( ~%trap_remove_dif%~ >= 0 )     BEGIN WRITE_SHORT  patch_offset + 0x6a ~%trap_remove_dif%~ END
    		PATCH_IF ( ~%is_trapped%~ >= 0 )          BEGIN WRITE_SHORT  patch_offset + 0x6c ~%is_trapped%~      END
    		PATCH_IF ( ~%is_trap_detect%~ >= 0 )      BEGIN WRITE_SHORT  patch_offset + 0x6e ~%is_trap_detect%~  END
    		PATCH_IF ( ~%launch_x%~ >= 0 )            BEGIN WRITE_SHORT  patch_offset + 0x70 ~%launch_x%~        END
    		PATCH_IF ( ~%launch_y%~ >= 0 )            BEGIN WRITE_SHORT  patch_offset + 0x72 ~%launch_y%~        END
    		PATCH_IF ( ~%key%~       STR_CMP ~same~ ) BEGIN WRITE_ASCIIE patch_offset + 0x74 ~%key%~        (8)  END
    		PATCH_IF ( ~%script%~    STR_CMP ~same~ ) BEGIN WRITE_ASCIIE patch_offset + 0x7c ~%script%~     (8)  END
    		PATCH_IF ( ~%alt_point_x%~ >= 0 )         BEGIN WRITE_SHORT  patch_offset + 0x84 ~%alt_point_x%~     END
    		PATCH_IF ( ~%alt_point_y%~ >= 0 )         BEGIN WRITE_SHORT  patch_offset + 0x86 ~%alt_point_y%~     END
    		PATCH_IF ( VARIABLE_IS_SET $vertex(0) AND ( $vertex(0) >= 0 ) ) BEGIN
    			READ_SHORT patch_offset + 0x2a vertex_cnt
    			READ_LONG  patch_offset + 0x2c vertex_first
    			SET deleted_vertex = 0 - vertex_cnt
    			READ_LONG  0x7c all_vertex_off
    			READ_SHORT 0x80 all_vertex_cnt
    			SET v_off = all_vertex_off + vertex_first * 0x004
    			SET num_v = 0
    			DELETE_BYTES v_off vertex_cnt * 0x004
    			SET x_bounding_left = 10000
    			SET x_bounding_top  = 10000
    			SET x_bounding_right  = 0
    			SET x_bounding_bottom = 0
    			FOR ( i = 0 ; i < 65535 ; ++i ) BEGIN
    				PATCH_IF ( VARIABLE_IS_SET $vertex(~%i%~) ) BEGIN
    					SET v_num = $vertex(~%i%~)
    					INSERT_BYTES v_off + i * 0x004 0x004
    					WRITE_LONG   v_off + i * 0x004 v_num
    					LPF FC_GET_XY_COORDINATE INT_VAR num = v_num RET x1 y1 END
    					PATCH_IF ( x_bounding_left   > x1 ) BEGIN SET x_bounding_left   = x1 END
    					PATCH_IF ( x_bounding_top    > y1 ) BEGIN SET x_bounding_top    = y1 END
    					PATCH_IF ( x_bounding_right  < x1 ) BEGIN SET x_bounding_right  = x1 END
    					PATCH_IF ( x_bounding_bottom < y1 ) BEGIN SET x_bounding_bottom = y1 END
    					SET deleted_vertex = deleted_vertex + 1
    					SET num_v = num_v + 1
    				END ELSE BEGIN SET i = 65535 END
    			END
    			WRITE_SHORT 0x80 all_vertex_cnt + deleted_vertex
    			WRITE_SHORT patch_offset + 0x2a num_v
    			WRITE_SHORT patch_offset + 0x22 x_bounding_left
    			WRITE_SHORT patch_offset + 0x24 x_bounding_top
    			WRITE_SHORT patch_offset + 0x26 x_bounding_right
    			WRITE_SHORT patch_offset + 0x28 x_bounding_bottom
    			LPF FC_UPDATE_VERTEX_INDEX
    				INT_VAR skip = door_pos numx = vertex_first adds = deleted_vertex
    				STR_VAR type = trigger
    			END
    			LPF FC_UPDETE_AREA_OFFSETS INT_VAR num = deleted_vertex STR_VAR type = vertex END
    			CLEAR_ARRAY vertex
    		END
    		SET done = 1
    	END
    	//BLOCKEND
    END
    //BLOCKEND
    
    //BLOCK FC_EDIT_AREA_CONTAINER
    DEFINE_PATCH_FUNCTION FC_EDIT_AREA_CONTAINER
    	INT_VAR
    		loc_x           = "-1"
    		loc_y           = "-1"
    		type            = "-1"
    		lock_diff       = "-1"
    		flags           = "-1"
    		trap_detect_dif = "-1"
    		trap_remove_dif = "-1"
    		is_trapped      = "-1"
    		is_trap_detect  = "-1"
    		launch_x        = "-1"
    		launch_y        = "-1"
    		active_range    = "-1"
    		break_diff      = "-1"
    		lpick_text      = 99999999
    		//vertex_X
    		vertex_0        = "-1"
    	STR_VAR
    		match_name      = "same"
    		match_key       = "same"
    		match_script    = "same"
    		match_owner     = "same"
    		name            = "same"
    		script          = "same"
    		owner           = "same"
    		key             = "same"
    	RET
    		done
    BEGIN
    	//BLOCK 
    	SET done = 0
    	SET match = 0
    	READ_SHORT 0x074 ~d_cnt~
    	READ_LONG  0x070 ~d_off~
    	PATCH_IF ( type > 12 )          BEGIN SET type           = 4 END
    	PATCH_IF ( is_trapped > 1 )     BEGIN SET is_trapped     = 1 END
    	PATCH_IF ( is_trap_detect > 1 ) BEGIN SET is_trap_detect = 1 END /* */
    	PATCH_IF ( d_cnt > 0 ) BEGIN
    		FOR ( i = 0 ; i < d_cnt ; ++i ) BEGIN
    			SET offset = d_off + i * 0xc0
    			PATCH_IF ( ~%match_name%~ STR_CMP ~same~ ) BEGIN
    				READ_ASCII offset d_name (32) NULL
    				PATCH_IF ( ~%match_name%~ STR_EQ ~%d_name%~ ) BEGIN SET match = 1 END ELSE BEGIN SET match = 0 END
    			END
    			PATCH_IF ( ~%match_key%~ STR_CMP ~same~ ) BEGIN
    				READ_ASCII offset + 0x78 d_key (8) NULL
    				PATCH_IF ( ~%match_key%~ STR_EQ ~%d_key%~ ) BEGIN SET match = 1 END ELSE BEGIN SET match = 0 END
    			END
    			PATCH_IF ( ~%match_script%~ STR_CMP ~same~ ) BEGIN
    				READ_ASCII offset + 0x48 d_scr (8) NULL
    				PATCH_IF ( ~%match_script%~ STR_EQ ~%d_scr%~ ) BEGIN SET match = 1 END ELSE BEGIN SET match = 0 END
    			END
    			PATCH_IF ( ~%match_owner%~ STR_CMP ~same~ ) BEGIN
    				READ_ASCII offset + 0x58 d_owner (32) NULL
    				PATCH_IF ( ~%match_owner%~ STR_EQ ~%d_owner%~ ) BEGIN SET match = 1 END ELSE BEGIN SET match = 0 END
    			END
    			PATCH_IF (match) BEGIN SET door_pos = i SET i = d_cnt SET patch_offset = offset END
    		END
    	END
    	PATCH_IF (match) BEGIN
    		PATCH_IF ( ~%name%~      STR_CMP ~same~ ) BEGIN WRITE_ASCIIE patch_offset        ~%name%~       (32) END
    		PATCH_IF ( ~%loc_x%~ >= 0               ) BEGIN WRITE_SHORT  patch_offset + 0x20 ~%loc_x%~           END
    		PATCH_IF ( ~%loc_y%~ >= 0               ) BEGIN WRITE_SHORT  patch_offset + 0x22 ~%loc_y%~           END
    		PATCH_IF ( ~%type%~  >= 1               ) BEGIN WRITE_SHORT  patch_offset + 0x24 ~%type%~            END
    		PATCH_IF ( ~%lock_diff%~ >= 0           ) BEGIN WRITE_SHORT  patch_offset + 0x26 ~%lock_diff%~       END
    		PATCH_IF ( ~%flags%~ >= 0               ) BEGIN WRITE_LONG   patch_offset + 0x28 ~%flags%~           END
    		PATCH_IF ( ~%trap_detect_dif%~ >= 0     ) BEGIN WRITE_SHORT  patch_offset + 0x2c ~%trap_detect_dif%~ END
    		PATCH_IF ( ~%trap_remove_dif%~ >= 0     ) BEGIN WRITE_SHORT  patch_offset + 0x2e ~%trap_remove_dif%~ END
    		PATCH_IF ( ~%is_trapped%~ >= 0          ) BEGIN WRITE_SHORT  patch_offset + 0x30 ~%is_trapped%~      END
    		PATCH_IF ( ~%is_trap_detect%~ >= 0      ) BEGIN WRITE_SHORT  patch_offset + 0x32 ~%is_trap_detect%~  END
    		PATCH_IF ( ~%launch_x%~ >= 0            ) BEGIN WRITE_SHORT  patch_offset + 0x34 ~%launch_x%~        END
    		PATCH_IF ( ~%launch_y%~ >= 0            ) BEGIN WRITE_SHORT  patch_offset + 0x36 ~%launch_y%~        END
    		PATCH_IF ( ~%script%~    STR_CMP ~same~ ) BEGIN WRITE_ASCIIE patch_offset + 0x48 ~%script%~      (8) END
    		PATCH_IF ( ~%active_range%~ >= 0        ) BEGIN WRITE_SHORT  patch_offset + 0x56 ~%active_range%~    END
    		PATCH_IF ( ~%owner%~     STR_CMP ~same~ ) BEGIN WRITE_ASCIIE patch_offset + 0x58 ~%owner%~      (32) END
    		PATCH_IF ( ~%key%~       STR_CMP ~same~ ) BEGIN WRITE_ASCIIE patch_offset + 0x78 ~%key%~         (8) END
    		PATCH_IF ( ~%break_diff%~ >= 0          ) BEGIN WRITE_LONG   patch_offset + 0x80 ~%break_diff%~      END
    		PATCH_IF ( ~%lpick_text%~ !=   99999999 ) BEGIN WRITE_LONG   patch_offset + 0x84 ~%lpick_text%~      END
    		PATCH_IF ( VARIABLE_IS_SET $vertex(0) AND ( $vertex(0) >= 0 ) ) BEGIN
    			READ_SHORT patch_offset + 0x54 vertex_cnt
    			READ_LONG  patch_offset + 0x50 vertex_first
    			SET deleted_vertex = 0 - vertex_cnt
    			READ_LONG  0x7c all_vertex_off
    			READ_SHORT 0x80 all_vertex_cnt
    			SET v_off = all_vertex_off + vertex_first * 0x004
    			SET num_v = 0
    			DELETE_BYTES v_off vertex_cnt * 0x004
    			SET x_bounding_left = 10000
    			SET x_bounding_top  = 10000
    			SET x_bounding_right  = 0
    			SET x_bounding_bottom = 0
    			FOR ( i = 0 ; i < 65535 ; ++i ) BEGIN
    				PATCH_IF ( VARIABLE_IS_SET $vertex(~%i%~) ) BEGIN
    					SET v_num = $vertex(~%i%~)
    					INSERT_BYTES v_off + i * 0x004 0x004
    					WRITE_LONG   v_off + i * 0x004 v_num
    					LPF FC_GET_XY_COORDINATE INT_VAR num = v_num RET x1 y1 END
    					PATCH_IF ( x_bounding_left   > x1 ) BEGIN SET x_bounding_left   = x1 END
    					PATCH_IF ( x_bounding_top    > y1 ) BEGIN SET x_bounding_top    = y1 END
    					PATCH_IF ( x_bounding_right  < x1 ) BEGIN SET x_bounding_right  = x1 END
    					PATCH_IF ( x_bounding_bottom < y1 ) BEGIN SET x_bounding_bottom = y1 END
    					SET deleted_vertex = deleted_vertex + 1
    					SET num_v = num_v + 1
    				END ELSE BEGIN SET i = 65535 END
    			END
    			WRITE_SHORT 0x80 all_vertex_cnt + deleted_vertex
    			WRITE_SHORT patch_offset + 0x54 num_v
    			WRITE_SHORT patch_offset + 0x38 x_bounding_left
    			WRITE_SHORT patch_offset + 0x3a x_bounding_top
    			WRITE_SHORT patch_offset + 0x3c x_bounding_right
    			WRITE_SHORT patch_offset + 0x3e x_bounding_bottom
    			LPF FC_UPDATE_VERTEX_INDEX
    				INT_VAR skip = door_pos numx = vertex_first adds = deleted_vertex
    				STR_VAR type = container
    			END
    			LPF FC_UPDETE_AREA_OFFSETS INT_VAR num = deleted_vertex STR_VAR type = vertex END
    			CLEAR_ARRAY vertex
    		END
    		SET done = 1
    	END
    	//BLOCKEND
    END
    //BLOCKEND

     

     

  9. I haven't downloaded the new version yet. But at home he was correcting something. In some script, I don't remember exactly, there was a variable name bg_plot instead of bd_plot. And you can also change the ScriptName for Sendai from BG1. Otherwise, Sendai's murder figures in the achievements already in the first part. It doesn't interest me, but suddenly it matters to someone.

  10. I don't mind cooperating. But my approach to IWD is somewhat different. There will be another mod that will combine IWD with the BG story. Now I am drawing locations for the mod. But I am always ready for criticism and discussion.

    PS. What we have now, a trip to the IWD, is only for tests. And in the future, they will be available when choosing campaigns.

    PPS. In general, my subraces are implemented in a separate mod.

    PPS2. I started doing IWD1 when I didn’t have access to the Enhanced Editing version yet. So I took the old game as a basis, and then added what was added to Enhanced Edition. And another question for the authors of Unfinished Business. I have included it in my mod. But I would not like to have problems. If there is an objection, it will be deleted.

  11. Нi, @k4trhos. I just have some plans for going through the IWD. but about how to do it, I'm ready to talk. But only to small changes.

  12. On 5/23/2021 at 11:35 PM, Fauls said:

    In version 2.5.17.6 everything is fine, but in version 2.6.5 begins spam messages, we will wait for the fix ... Maybe there are considerations how to fix it?

    I do not know now. I don't have version 2.6+. And I can't say exactly when it will be. Therefore, I cannot check yet.

  13. 1 hour ago, Guest Feniks said:

    Just got Viconia and she has exactly the same problem.

    Perhaps some other mod changed something? I tested on SOD, BG2, EET and IWDEE. It never happened.

    What version of the game? I have 2.5.17.6. I don't have version 2.6, so I can't check it there.

  14. On 5/14/2021 at 2:55 AM, Guest Feniks said:

    Hopefully can be fixed, im playing a Drow, whenever i go indoors during the day, i get a repeated message that "Unaffected by effects from" which essentially seems to be the blindness being countered.

    Never seen a problem like this. I do not have any messages. It’s strange.

  15. Not. I want to make wings for basic character animations that the player can choose. In the same way as in 1pp, wings are made for eriniyes(I don't know exactly how this word is spelled in English ).

    Therefore, he forbade this race to use helmets.

×
×
  • Create New...