A dose-response curve carries two readable numbers. Its EC50 — the concentration for half-maximal effect — reports potency. Its ceiling (E_max) reports efficacy: how hard the tissue can be driven. Binding is not activation, so the two move independently.
A competitive blocker races the agonist for the same site, reversibly. At any instant the receptor holds whichever is winning, so flooding the bath with agonist wins the race back — the whole curve slides right (EC50 climbs) while the ceiling is untouched. That is surmountable antagonism, and it is why high-dose albuterol overrides a beta-blocker.
The rightward slide is lawful. The dose ratio is exactly 1 + [B]/K_b, so plotting log(DR − 1) against log[B] gives a straight line of slope one whose x-intercept reads off K_b. That is the Schild plot — how James Black's team characterised propranolol.
A non-competitive blocker instead removes receptors from play, pressing the ceiling itself down — insurmountable. And a partial agonist has low intrinsic efficacy τ, so even full occupancy tops out below E_max at every dose — buprenorphine caps at ~40 % of morphine. Which feature moves, potency or ceiling, names the mechanism.
Something in the simulation stopped unexpectedly — the lesson continues without it. You can move on; nothing you did was wrong.