Dependencies:
Functions in lib_2daq act on in-game 2da files in-place, rather than the read/write paradigm used in lib_2da. They're optimized for speed insofar as I can manage it (the 'q' stands for 'quick').
2daq_copy_column(data_read:b, column:s, column_new:s="%column%")=(value:s) patch
Copies a column in the current 2da file to the right-hand side of the table, with new column name 'column_new'. Returns 1 if copy is successful. Stoically silent if it isn't.
2daq_copy_row(rowname_column:i, data_read:b, row:s, row_new:s="9")=(value:s) patch
Copies a row in the current 2da file to the bottom of the table, with new row name 'row_new'. Returns 1 if copy is successful. Stoically silent if it isn't.
If 'rowname_column' is set, the row id is looked up in that column, and column 0 is assumed to be numbered sequentially. (This is the convention for kitlist.2da.)
2daq_extract(rowname_column:i, data_read:i, row:s, column:s)=(value:s, array:a) patch
2daq_extract(rowname_column:i, data_read:b, resref:s, row:s, column:s)=(value:s, array:a) action
Given a column header and/or a row header, and a 2da file resref, (or, in patch context, the current 2da file), extract the column or row as k=>v array using the row or column headers, as appropriate, as keys.
If both row and column are set, instead return the element (if any) at (row,column)
2daq_has_column(data_read:b, column:s)=(value:s) patch
Return 1 iff the current 2da file has 'column' as a column id.
2daq_has_row(rowname_column:i, data_read:b, row:s)=(value:s) patch
Return 1 iff the current 2da file has 'row' as a row id. (Check rowname_column).
2daq_inject(reflect:b, rowname_column:i, data_read:b, array:a)=() patch
2daq_inject(reflect:b, rowname_column:i, data_read:b, array:a, resref:s)=() action
Given a 2D struct 'array' and a 2da file resref, (or, in patch context, the current 2da file) insert the elements of the struct into the 2da. (i.e. if the struct contains "array_x_y" and x and y are row and column entries in the 2da, insert the value of array_x_y at (x,y).
If reflect=1, swap rows and columns. If rowname_column is nonzero, look up the row names in that column.
2daq_insert_column(column:s, insert_loc:[l="last"ast|before_last])=() patch
Adds a new column, with header 'column', as the last column, or the second-to-last column if insert_loc is 'before_last'. All entries are filled with the 2da default value.
2daq_insert_row(rowname_column:i, row:s)=() patch
Adds a new row, with header 'row', as the last row. All entries are filled with the 2da default value. If rowname_column>0, we put the header in this column, and assume column 0 should be numbered sequentially from 0.