dmolony-DiskBrowser/src/com/bytezone/diskbrowser/wizardry/Reward.java

163 lines
4.8 KiB
Java
Raw Permalink Normal View History

2020-02-11 07:29:55 +00:00
package com.bytezone.diskbrowser.wizardry;
import java.util.ArrayList;
import java.util.List;
import com.bytezone.diskbrowser.applefile.AbstractFile;
// -----------------------------------------------------------------------------------//
class Reward extends AbstractFile
// -----------------------------------------------------------------------------------//
{
static String[] types = { "gold", "item" };
static final int SEGMENT_LENGTH = 18;
2022-03-28 03:55:49 +00:00
2020-02-11 07:29:55 +00:00
int id;
int totalElements;
2022-03-28 03:55:49 +00:00
2020-02-11 07:29:55 +00:00
List<RewardElement> elements;
2022-05-31 07:44:41 +00:00
List<ItemV1> items;
List<MonsterV1> goldMonsters = new ArrayList<> ();
List<MonsterV1> chestMonsters = new ArrayList<> ();
2020-02-11 07:29:55 +00:00
// ---------------------------------------------------------------------------------//
2022-05-31 07:44:41 +00:00
Reward (String name, byte[] buffer, int id, List<ItemV1> items)
2020-02-11 07:29:55 +00:00
// ---------------------------------------------------------------------------------//
{
super (name, buffer);
2022-03-28 03:55:49 +00:00
2020-02-11 07:29:55 +00:00
this.id = id;
this.items = items;
2022-03-28 03:55:49 +00:00
2020-02-11 07:29:55 +00:00
totalElements = buffer[4];
elements = new ArrayList<> (totalElements);
for (int i = 0; i < totalElements; i++)
{
byte[] buffer2 = new byte[SEGMENT_LENGTH];
System.arraycopy (buffer, i * SEGMENT_LENGTH, buffer2, 0, SEGMENT_LENGTH);
elements.add (new RewardElement (buffer2));
}
}
// ---------------------------------------------------------------------------------//
2022-05-31 07:44:41 +00:00
public void addMonster (MonsterV1 monster, int location)
2020-02-11 07:29:55 +00:00
// ---------------------------------------------------------------------------------//
{
if (location == 0)
goldMonsters.add (monster);
else
chestMonsters.add (monster); // lair
2020-02-11 07:29:55 +00:00
}
// ---------------------------------------------------------------------------------//
@Override
public String getText ()
// ---------------------------------------------------------------------------------//
{
return getText (true);
}
// ---------------------------------------------------------------------------------//
public String getText (boolean showLinks)
// ---------------------------------------------------------------------------------//
{
StringBuilder text = new StringBuilder ();
for (RewardElement re : elements)
text.append (re.getDetail () + "\n");
if (showLinks)
{
if (goldMonsters.size () > 0)
{
text.append ("Without chest:\n\n");
2022-05-31 07:44:41 +00:00
for (MonsterV1 m : goldMonsters)
2020-02-11 07:29:55 +00:00
text.append (" " + m + "\n");
text.append ("\n");
}
if (chestMonsters.size () > 0)
{
text.append ("With chest:\n\n");
2022-05-31 07:44:41 +00:00
for (MonsterV1 m : chestMonsters)
2020-02-11 07:29:55 +00:00
text.append (" " + m + "\n");
}
}
return text.toString ();
}
// ---------------------------------------------------------------------------------//
public String getDump ()
// ---------------------------------------------------------------------------------//
{
StringBuilder text = new StringBuilder ();
int seq = 0;
for (RewardElement re : elements)
{
text.append (seq++ == 0 ? String.format ("%02X : ", id) : " ");
text.append (re + "\n");
}
return text.toString ();
}
// ---------------------------------------------------------------------------------//
private class RewardElement
// ---------------------------------------------------------------------------------//
{
int type;
int odds;
byte[] buffer;
public RewardElement (byte[] buffer)
{
this.buffer = buffer;
2022-04-06 08:05:37 +00:00
2020-02-11 07:29:55 +00:00
type = buffer[8];
odds = buffer[6];
}
@Override
public String toString ()
{
StringBuilder text = new StringBuilder ();
for (int i = 0; i < SEGMENT_LENGTH; i += 2)
text.append (String.format ("%3d ", buffer[i] & 0xFF));
return text.toString ();
}
public String getDetail ()
{
StringBuilder text = new StringBuilder ();
text.append ("Odds ............ " + odds + "%\n");
switch (type)
{
case 0:
text.append ("Gold ............ " + buffer[10] + "d" + buffer[12] + "\n");
break;
2022-03-28 03:55:49 +00:00
2020-02-11 07:29:55 +00:00
case 1:
int lo = buffer[10] & 0xFF;
int qty = buffer[16] & 0xFF;
boolean title = true;
String[] lineItem = new String[4];
2022-03-28 03:55:49 +00:00
2020-02-11 07:29:55 +00:00
for (int i = lo, max = lo + qty; i <= max; i += lineItem.length)
{
String lineTitle = title ? "Items ..........." : "";
title = false;
for (int j = 0; j < lineItem.length; j++)
2022-03-26 08:07:17 +00:00
lineItem[j] = i + j < items.size () ? items.get (i + j).getName () : "";
text.append (String.format ("%-17s %-16s %-16s %-16s %-16s%n", lineTitle, lineItem[0],
lineItem[1], lineItem[2], lineItem[3]));
2020-02-11 07:29:55 +00:00
}
break;
2022-03-28 03:55:49 +00:00
2020-02-11 07:29:55 +00:00
default:
System.out.println ("Unknown reward type " + type);
}
return text.toString ();
}
}
2015-06-01 09:35:51 +00:00
}