(svn r9876) -Codechange: [NewHouses] Add support for callback 2E (cargo production)
authorpeter1138
Sat, 19 May 2007 11:17:30 +0000
changeset 6645 289779d21015
parent 6644 327f66bc01c6
child 6646 eed9bfa40428
(svn r9876) -Codechange: [NewHouses] Add support for callback 2E (cargo production)
src/newgrf.cpp
src/town_cmd.cpp
--- a/src/newgrf.cpp	Sat May 19 10:29:51 2007 +0000
+++ b/src/newgrf.cpp	Sat May 19 11:17:30 2007 +0000
@@ -4213,7 +4213,7 @@
 	                   |                                        (0 << 0x04)  // aichoosechance
 	                   |                                        (1 << 0x05)  // resolutionwidth
 	                   |                                        (1 << 0x06)  // resolutionheight
-	                   |                                        (0 << 0x07)  // newindustries
+	                   |                                        (1 << 0x07)  // newindustries
 	                   |         ((_patches.improved_load ? 1 : 0) << 0x08)  // fifoloading
 	                   |                                        (0 << 0x09)  // townroadbranchprob
 	                   |                                        (0 << 0x0A)  // tempsnowline
--- a/src/town_cmd.cpp	Sat May 19 10:29:51 2007 +0000
+++ b/src/town_cmd.cpp	Sat May 19 11:17:30 2007 +0000
@@ -400,24 +400,55 @@
 
 	r = Random();
 
-	if (GB(r, 0, 8) < hs->population) {
-		uint amt = GB(r, 0, 8) / 8 + 1;
-		uint moved;
-
-		if (_economy.fluct <= 0) amt = (amt + 1) >> 1;
-		t->new_max_pass += amt;
-		moved = MoveGoodsToStation(tile, 1, 1, CT_PASSENGERS, amt);
-		t->new_act_pass += moved;
-	}
-
-	if (GB(r, 8, 8) < hs->mail_generation) {
-		uint amt = GB(r, 8, 8) / 8 + 1;
-		uint moved;
-
-		if (_economy.fluct <= 0) amt = (amt + 1) >> 1;
-		t->new_max_mail += amt;
-		moved = MoveGoodsToStation(tile, 1, 1, CT_MAIL, amt);
-		t->new_act_mail += moved;
+	if (HASBIT(hs->callback_mask, CBM_HOUSE_PRODUCE_CARGO)) {
+		for (uint i = 0; i < 256; i++) {
+			uint16 callback = GetHouseCallback(CBID_HOUSE_PRODUCE_CARGO, i, r, house_id, t, tile);
+
+			if (callback == CALLBACK_FAILED) break;
+			if (callback == 0x20FF) break;
+
+			CargoID cargo = GetCargoTranslation(GB(callback, 8, 7), hs->grffile);
+			if (cargo == CT_INVALID) continue;
+
+			uint amt = GB(callback, 0, 8);
+			uint moved = MoveGoodsToStation(tile, 1, 1, cargo, amt);
+
+			const CargoSpec *cs = GetCargo(cargo);
+			switch (cs->town_effect) {
+				case TE_PASSENGERS:
+					t->new_max_pass += amt;
+					t->new_act_pass += moved;
+					break;
+
+				case TE_MAIL:
+					t->new_max_mail += amt;
+					t->new_act_mail += moved;
+					break;
+
+				default:
+					break;
+			}
+		}
+	} else {
+		if (GB(r, 0, 8) < hs->population) {
+			uint amt = GB(r, 0, 8) / 8 + 1;
+			uint moved;
+
+			if (_economy.fluct <= 0) amt = (amt + 1) >> 1;
+			t->new_max_pass += amt;
+			moved = MoveGoodsToStation(tile, 1, 1, CT_PASSENGERS, amt);
+			t->new_act_pass += moved;
+		}
+
+		if (GB(r, 8, 8) < hs->mail_generation) {
+			uint amt = GB(r, 8, 8) / 8 + 1;
+			uint moved;
+
+			if (_economy.fluct <= 0) amt = (amt + 1) >> 1;
+			t->new_max_mail += amt;
+			moved = MoveGoodsToStation(tile, 1, 1, CT_MAIL, amt);
+			t->new_act_mail += moved;
+		}
 	}
 
 	_current_player = OWNER_TOWN;